繁体   English   中英

strsep()用法及其替代方法

[英]strsep() usage and its alternative

#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 == NULL 这是strsep行为的描述

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

strsep()的返回是错误的

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

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

strsep表现正常 - 从手册页

strsep()函数在*stringp引用的字符串中找到字符串delim(或终止\\0字符)中任何字符的第一个匹配项,并用\\0替换它。 分隔符后面的下一个字符的位置(如果到达字符串的末尾,则为NULL )存储在*stringp 返回*stringp的原始值。

第二种情况正确的 - 由于未找到分隔符,因此第一个参数设置为指向NULL并返回原始字符串。 如你所说,你需要检查if (slow_gun == NUll)来检测这个。

(顺便说一句,这是一个令人困惑的变量名称选择)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM