#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;
}

当我执行它时:
$ cc -o try try_strsep.c
$ ./try

 slow_gun: kaliya} [namak]
 token: together

但是,当我将char *标语更改为:
char *slogan = "kalia} [namak]";

并执行相同的程序:
$ vi try_strsep.c
$ cc -o try try_strsep.c
$ ./try

 slow_gun: (null)
 token: kalia} [namak]

我的问题是,所以当我使用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

有没有一种方法可以避免此IF检查,而是依靠该函数将substr返回给我,如果不存在,则返回NULL

最佳答案

不,没有办法避免检查slow_gun == NULLstrsep的行为的Here's a description:

char *strsep(char **stringp, const char *delim);



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

如果定界符是字符串中的最后一个字符,则该字符将被'\0'覆盖,并将slow_gun设置为以下字符,该字符恰好是终止原始字符串的'\0'。这就是为什么print语句打印一个空字符串的原因。

注意您使用的strdup错误,调用者负责在该函数返回的指针上调用free

07-26 06:00