- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
#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 *slogan 更改为:
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
。 Here's a description strsep
的行为:
char *strsep(char **stringp, const char *delim);
DESCRIPTION
If*stringp
isNULL
, thestrsep()
function returnsNULL
and does nothing else. Otherwise, this function finds the first token in the string*stringp
, where tokens are delimited by symbols in the stringdelim
. This token is terminated by overwriting the delimiter with a null byte ('\0'
) and*stringp
is updated to point past the token. In case no delimiter was found, the token is taken to be the entire string*stringp
, and*stringp
is madeNULL
.RETURN VALUE
Thestrsep()
function returns a pointer to the token, that is, it returns the original value of*stringp
.
因此,如果未找到匹配项,strsep
将返回指向原始字符串的指针并将 slow_gun
输入设置为 NULL。
如果定界符是字符串中的最后一个字符,该字符将被 '\0' 覆盖,并且 slow_gun
设置为后面的字符,恰好是终止字符串的 '\0'原始字符串。这就是 print 语句打印空字符串的原因。
注意 您错误地使用了 strdup
,调用者负责在该函数返回的指针上调用 free
。
关于c - strsep() 用法及其替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6865963/
#include #include #include int main() { char *buf = "2012/9/8"; char sep[] = "/"; char *tok
我正在尝试使用 strsep() 解析文本字符串 (char *),问题是分隔符必须按顺序使用,例如:第一个标记为 ',',第二个标记为 ':'。 . sep = " ,:-,.!."; tofree
我用 C 语言为 simpleShell 程序创建了一个 parseCmd 方法,并将每个参数存储在分隔符空格之前,以存储在我的 args[] 数组中。但是,我试图将参数及其各自的参数添加到链接列表中
strsep 没有正确解析我的字符串。我用""作为分隔符,解析的是单词中间的字符串。我不明白为什么。 代码: #include #include #include #include #defi
#include #include int main() { char *slogan = "together{kaliya} [namak]"; char *slow_gun = strdup(
使用函数 strsep 查找字符串的第一个单词似乎存在指针兼容性问题。到目前为止,我一直认为 char *s 和 char s[] 是完全可以互换的。但似乎他们不是。我在堆栈上使用数组的程序失败并显示
我写了这个函数: char** parse_parameters(const char* input_string, int num_params, char** params) { char
我正在尝试编写一系列将文件名作为输入(例如 main.c)并使用 strsep() 返回文件扩展名的函数。当我运行该程序时,每当调用 strsep 函数时都会出现总线错误。这是代码: static c
当我使用 strsep() 遍历字符串的标记时,存储指向这些标记的指针并在以后引用它们是否安全?示例: char str[] = "some word tokens"; char *sameStr =
运行下面的代码时出现段错误。 它基本上应该读取一个超过 3M 行的 .csv 文件,然后再做其他事情(与问题无关),但在 207746 次迭代后它返回一个段错误。如果我删除 p = strsep(&l
我正在创建一个程序,启动时会使用 scanf 输入命令和一些参数,并使用这些参数调用 execvp。我正在使用 strsep 执行此操作。我将字符串存储在一个数组 (char*) 中,然后我想将其拆分
使用 strsep 拆分包含一堆无用垃圾的 CSV (","Delim)。其中一个条目两边都有引号(即 Florida,"Bob",1999),我想在将它们保存到数组中之前将其取出。 如何删除名称中的
我在用户空间中有一个程序写入内核模块中的 sysfs 文件。我已经隔离出崩溃的根源很可能是这个特定的函数,因为当我在到达这一点之前运行用户代码时它不会崩溃,但是当我添加写入代码时它很可能崩溃。我怀疑我
平台:Linux、OSX 编译器:GCC 我有一个简单的程序,目前让我感到困惑 - 我知道我正在弄乱几种不同类型的数组/指针来产生这个问题 - 它是故意的 - 我试图理解它。 列出的代码将按预期编译和
我正在使用一小段代码来测试较大(初学者)程序的功能,但我在显示从字符串中提取的 token 时遇到问题。 我发现并使用了: #include #include int main() { char
同时使用 getline 和 strsep 时发生内存泄漏。我知道 strsep 修改了 line - 这可能是原因吗?该 line 未正确释放。 FILE *file = fopen("keyw
int main(int argc, char *argv[]) { char *line, buffer[1024]; char *token, *setValue, *po
GCC 8.2.0 未检测到使用 -fsanitize=address 编译的以下代码中的泄漏: #include #include #include int main() {
尝试使用 strsep() 解析逗号分隔值文件时,我得到了一些不需要的输出。它似乎适用于文件的一半,其中一个数字只有一个值(即 0-9),但是一旦添加了多个值,例如 512, 它将打印 512 12
我有以下代码: #include int main(void) { char *buffer = NULL, **words = NULL, *aPtr = NULL, *sPtr;
我是一名优秀的程序员,十分优秀!