首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strsep()用法及其选择

strsep()用法及其选择
EN

Stack Overflow用户
提问于 2011-07-28 21:29:33
回答 3查看 64.8K关注 0票数 6
代码语言:javascript
复制
#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;
}

当我执行时:

代码语言:javascript
复制
$ cc -o try try_strsep.c
$ ./try

 slow_gun: kaliya} [namak]
 token: together  

但当我将char *口号改为:

代码语言:javascript
复制
char *slogan = "kalia} [namak]";

并执行相同的程序:

代码语言:javascript
复制
$ 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)

代码语言:javascript
复制
$ cc -o try try_strsep.c
$ ./try

 slow_gun: 
 token: together

如果检查并依赖函数返回substr,是否可以避免这种情况,如果不存在,则返回NULL

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-28 21:43:44

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

代码语言:javascript
复制
char *strsep(char **stringp, const char *delim);

描述 如果*stringpNULL,则strsep()函数返回NULL而不执行其他操作。否则,此函数将在字符串*stringp中找到第一个令牌,其中标记由字符串delim中的符号分隔。通过用空字节('\0')覆盖分隔符来终止此令牌,并更新*stringp以指向令牌。如果没有找到分隔符,则将令牌视为整个字符串*stringp,而*stringp则为NULL返回值 strsep()函数返回一个指向令牌的指针,即返回*stringp的原始值。

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

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

注意:您不正确地使用strdup,调用方负责在该函数返回的指针上调用free

票数 13
EN

Stack Overflow用户

发布于 2011-07-28 21:41:12

返回strsep()是错误的

那是不对的。strsep()返回它找到的第一个令牌--根据定义,字符串的开头是第一个令牌。只是在本例中没有找到终止令牌的分隔符(因此字符串的其余部分就是令牌)。

strsep()不打算用于“查找模式”--它用于根据一组分隔符分隔标记。如果要查找字符,请使用strchr()strpbrk()

票数 7
EN

Stack Overflow用户

发布于 2011-07-28 21:41:28

strsep的行为是正确的-来自手册页

strsep()函数在*stringp引用的字符串中定位字符串中任何字符的第一次出现(或终止\0字符),并将其替换为\0。分隔符字符之后的下一个字符的位置(如果到达字符串的末尾,则为NULL )存储在*stringp中。返回*stringp的原始值。

第二种情况是正确的--因为没有找到Ded示波器,所以第一个参数被设置为指向NULL,并且返回原始字符串。正如您所说的,您需要检查if (slow_gun == NUll)来检测到这一点。

(顺便说一句,这是一个非常混乱的变量名选择)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6865963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档