gpt4 book ai didi

c++ - 如何制作一个非空终止的 c 字符串?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:38 26 4
gpt4 key购买 nike

我想知道 :char *cs = .....;如果 cs 指向一个很大但没有 '\0' 的内存块,strlen() 和 printf("%s",cs) 会发生什么在里面? 我写下这些行:

 char s2[3] = {'a','a','a'};
printf("str is %s,length is %d",s2,strlen(s2));

我得到结果:“aaa”,“3”,但我认为这个结果是因为 '\0'(或 0 字节)恰好位于位置 s2+3。如何制作一个非空终止的 c 字符串? strlen和其他c字符串函数严重依赖'\0'字节,如果没有'\0'怎么办,我只想更深入更好地了解这个规则。

ps: 我的好奇心是通过研究 SO 上的 folw 帖子引起的。 How to convert a const char * to std::string那篇文章中的这些词:“这实际上比看起来更棘手,因为除非字符串实际上以 nul 终止,否则您不能调用 strlen。”

最佳答案

如果它不是空终止的,那么它就不是 C 字符串,并且您不能使用像 strlen 这样的函数 - 它们会离开数组的末尾,导致未定义的行为。您需要以其他方式跟踪长度。

只要给出长度,您仍然可以使用 printf 打印非终止字符数组:

printf("str is %.3s",s2);
printf("str is %.*s",s2_length,s2);

或者,如果您有权访问数组本身,而不是指针:

printf("str is %.*s", (int)(sizeof s2), s2);

您还标记了 C++ 问题:在该语言中,您通常希望避免所有这些容易出错的恶意代码并改用 std::string

关于c++ - 如何制作一个非空终止的 c 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20683552/

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