我很担心 C 中的字符串。我需要设置最后一个字符 \0 还是它自己设置?如果我不手动执行,那么当我尝试调试代码以及访问 string1[257] 时它不为空。我在释放字符串数组的分配内存时遇到问题,所以我认为这是一个原因。
char string1[257], string2[257];
scanf("%s", &string2);
string1[257] = '\0';
strncpy(string1, string2, 257);
string1[257] = '\0'; /* do I need to do that? */
Run Code Online (Sandbox Code Playgroud)
Mic*_*ice 11
字符串文字"Hello World!"以 null 结尾,但char数组不会自动以 null 结尾。
我一直采取的一般原则是要格外小心,并分配'\0'给字符串的末尾,除非这会导致性能问题。在这些情况下,我会格外小心我使用的库函数。
绝对有必要吗?不,因为当您调用scanf, strcpy(除非strncpy超出大小时需要手动输入零),它会为您复制空终止符。无论如何这样做好吗?事实并非如此,它并不能真正解决缓冲区溢出问题,因为这些函数无论如何都会超出缓冲区的大小。那么最好的办法是什么?将 C++ 与std::string.
顺便说一句,如果您访问/写入string1[257],这将超出范围,因为您正在访问/写入大小为 257 的数组中的第 258 个元素。(它是基于 0 的索引)