strsep()用法及其替代方法

har*_*ari 6 c string tokenize strsep

#include <stdio.h>
#include <string.h>

int main() {

char *slogan = "together{kaliya} [namak]";
char *slow_gun = strdup(slogan);

char *token = strsep(&slow_gun, "{");

printf ("\n slow_gun: %s\n token: %s\n", slow_gun, token);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我执行它时:

$ cc -o try try_strsep.c
$ ./try

 slow_gun: kaliya} [namak]
 token: together  
Run Code Online (Sandbox Code Playgroud)

但是,当我将char*口号改为:

char *slogan = "kalia} [namak]";
Run Code Online (Sandbox Code Playgroud)

并执行相同的程序:

$ vi try_strsep.c 
$ cc -o try try_strsep.c
$ ./try

 slow_gun: (null)
 token: kalia} [namak]
Run Code Online (Sandbox Code Playgroud)

我的问题是,所以当我使用strsep()并且输入字符串没有我正在寻找的模式时,返回strsep()是错误的.我可以验证strsep()是否找不到模式的唯一方法是检查if (slow_gun == NUll).

如果我有char *slogan = "together{"那么strsep将成功返回token,但返回slow_gun空白(不null)

$ cc -o try try_strsep.c
$ ./try

 slow_gun: 
 token: together
Run Code Online (Sandbox Code Playgroud)

有没有办法我可以避免这种IF检查并依靠函数返回我的substr,如果不存在,返回NULL

Pra*_*ian 12

不,没有办法避免检查slow_gun == NULL.这里有一个描述strsep的行为:

char *strsep(char **stringp, const char *delim);
Run Code Online (Sandbox Code Playgroud)

描述
如果*stringpNULL,则该strsep()函数返回NULL并且不执行任何其他操作.否则,此函数在字符串中查找第一个标记*stringp,其中标记由字符串中的符号分隔delim.通过使用空字节('\0')覆盖分隔符来终止此标记,并将*stringp其更新为指向令牌.如果没有找到分隔符,则将令牌作为整个字符串*stringp*stringp进行制作NULL.

返回值
strsep()函数返回一个指向令牌的指针,即返回原始值*stringp.

因此,如果未找到匹配项,则strsep返回指向原始字符串的指针,并将slow_gun输入设置为NULL.

如果分隔符是字符串中的最后一个字符时,它是由"\ 0"覆盖,并slow_gun设置为下面的字符,这恰好是"\ 0"终止原字符串.这就是print语句打印空字符串的原因.

注意您使用strdup不正确,调用者负责调用free该函数返回的指针.


Mic*_*urr 7

strsep()的返回是错误的

那是不对的. strsep()返回它找到的第一个标记 - 字符串的开头按定义是第一个标记.只是在这种情况下没有找到终止令牌的分隔符(所以字符串的其余部分是令牌).

strsep()不是用来'找到模式' - 它用于根据一组分隔符分隔标记.如果要查找角色,请使用strchr()strpbrk().