gpt4 book ai didi

c - 我误解了 win32(也许还有 libc)strtok()

转载 作者:太空狗 更新时间:2023-10-29 16:03:54 24 4
gpt4 key购买 nike

在某些 CGI 代码中,我需要对很少出现的“&”、“<”和“>”字符进行编码。在编码函数中,如果输入字符串中没有这样的字符,我想立即退出。因此,在入口处,我尝试使用 strtok( ) 来找出答案:

char *
encode_amp_lt_gt ( char *in ) {
...
if ( NULL == strtok( in, "&<>" )) {
return in;
}
...
}

但是,即使没有任何定界符,strtok( ) 也会返回指向 in 的第一个字符的指针。

如果字符串中没有 delims,我预计它会返回 NULL。

是我的代码错了,还是我的期望错了?我不想为了消除常见情况而调用 strchr() 三次。

谢谢!

最佳答案

你可能不想要 strtok首先,因为它让您无法确定删除了哪个字符(除非您有该字符串的备用副本)。

strtok不是一个简单的 API,很容易被误解。

引用manpage :

 The strtok() and strtok_r() functions return a pointer to the beginning of
each subsequent token in the string, after replacing the token itself with
a NUL character. When no more tokens remain, a null pointer is returned.

您的问题可能意味着您陷入了算法的晦涩难懂。假设这个字符串:

char* value = "foo < bar & baz > frob";

第一次调用strtok :

char* ptr = strtok(value, "<>&");

strtok将返回给你 value指针,除此之外它将把字符串修改为:

"foo \0 bar & baz > frob"

您可能会注意到,它更改了 <NUL .但是,现在,如果您使用 value ,你会得到 "foo "因为有一个 NUL在中途。

随后调用 strtokNULL将继续遍历字符串,直到到达字符串的末尾,此时您将获得 NULL .

char* str = "foo < bar & frob > nicate";
printf("%s\n", strtok(str, "<>&")); // prints "foo "
printf("%s\n", strtok(NULL, "<>&")); // prints " bar "
printf("%s\n", strtok(NULL, "<>&")); // prints " frob "
printf("%s\n", strtok(NULL, "<>&")); // prints " nicate"
assert(strtok(NULL, "<>&") == NULL); // should be true

如果不使用 strtok 来编写一个替换内容的函数会相当简单,要么自己处理艰苦的工作,要么从 strpbrk 获得帮助和 strcat .

关于c - 我误解了 win32(也许还有 libc)strtok(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com