非空结尾字符的char字符串使用strlen()函数?

29

s没有以空字符结尾时,strlen(const char *s)被定义了吗?如果有的话,它返回什么?


9
问自己:如果字符串没有以空字符结尾,strlen() 如何知道它的结尾在哪里? - DevSolar
2
从技术上讲,不存在未以NUL结尾的C字符串,因为NUL终止符被定义为C字符串的一部分 :) - fredoverflow
你考虑过查阅文档吗? - user207421
如果您知道缓冲区大小,您可能希望使用 memchr,它会返回空指针(null pointer),如果没有找到空终止符,或者使用 strnlen 来限制字符串的最大长度。 - Phi
9个回答

42

不,它没有定义。这可能会导致内存访问冲突,因为它将继续计数直到达到第一个值为0的内存字节。


21
它还会导致恶魔从你的鼻子里飞出来。http://catb.org/jargon/html/N/nasal-demons.html - Paul Tomblin
7
那解释了我鼻子疼的原因。 - Engineer

12

来自C99标准:

strlen函数返回终止空字符之前的字符数。

如果没有空字符,那么结果是未定义的。


5

也许您需要使用strnlen函数?


5
很遗憾,这不是标准C的一部分。 - joveha

2
不完全是这样,这会导致一些不好的事情发生。请参考这里

2
如果您的字符串没有以NUL结尾,该函数将继续查找直到找到为止。如果幸运的话,这将导致程序崩溃。如果不幸的话,您将会得到一个比预期更长的长度,并且其中包含许多“意外”的值。请注意保留HTML标记。

1

它未被定义。这会导致未定义的行为,意味着任何事情都可能发生,最有可能的是您的程序会崩溃。


0

它将返回在找到'\0'之前遇到的字符数。


0

strlen() 只能在以 null 结尾的字符串上工作,如果你传入其他类型的字符串,将会得到完全未定义的结果。如果你幸运的话,它不会导致崩溃 :)


6
更正一下,如果他幸运的话,它会崩溃。你肯定不希望这种错误被忽视掉 :-P - Evan Teran

-3

man 3 strcspn

size_t strcspn(const char *s, const char *reject);

一个由冒号分隔的字符串长度:

size_t len = strcspn(str, ":");

一串逗号分隔的字符串长度:

size_t len = strcspn(str, ",");

一组以制表符分隔的字符串长度:

size_t len = strcspn(str, "\t");

完全没有回答问题。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接