#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如果检查并依赖函数返回substr,是否可以避免这种情况,如果不存在,则返回NULL
发布于 2011-07-28 21:43:44
不,没有办法避免检查slow_gun == NULL。这里有一个描述 of strsep的行为:
char *strsep(char **stringp, const char *delim);描述 如果
*stringp是NULL,则strsep()函数返回NULL而不执行其他操作。否则,此函数将在字符串*stringp中找到第一个令牌,其中标记由字符串delim中的符号分隔。通过用空字节('\0')覆盖分隔符来终止此令牌,并更新*stringp以指向令牌。如果没有找到分隔符,则将令牌视为整个字符串*stringp,而*stringp则为NULL。 返回值strsep()函数返回一个指向令牌的指针,即返回*stringp的原始值。
因此,如果没有找到匹配项,strsep将返回指向原始字符串的指针,并将slow_gun输入设置为NULL。
如果分隔符是字符串中的最后一个字符,则该字符将被'\0‘覆盖,并且slow_gun设置为以下字符,该字符恰好是终止原始字符串的'\0’。这就是print语句打印空字符串的原因。
注意:您不正确地使用strdup,调用方负责在该函数返回的指针上调用free。
发布于 2011-07-28 21:41:12
返回strsep()是错误的
那是不对的。strsep()返回它找到的第一个令牌--根据定义,字符串的开头是第一个令牌。只是在本例中没有找到终止令牌的分隔符(因此字符串的其余部分就是令牌)。
strsep()不打算用于“查找模式”--它用于根据一组分隔符分隔标记。如果要查找字符,请使用strchr()或strpbrk()。
发布于 2011-07-28 21:41:28
strsep的行为是正确的-来自手册页。
strsep()函数在*stringp引用的字符串中定位字符串中任何字符的第一次出现(或终止\0字符),并将其替换为\0。分隔符字符之后的下一个字符的位置(如果到达字符串的末尾,则为NULL)存储在*stringp中。返回*stringp的原始值。
第二种情况是正确的--因为没有找到Ded示波器,所以第一个参数被设置为指向NULL,并且返回原始字符串。正如您所说的,您需要检查if (slow_gun == NUll)来检测到这一点。
(顺便说一句,这是一个非常混乱的变量名选择)。
https://stackoverflow.com/questions/6865963
复制相似问题