我非常担心C中的字符串。我是否需要设置最后一个字符\0还是由它自己完成?如果我不手动执行操作,则当我尝试调试代码并访问string1 [257]时,它不为null。我在释放分配的字符串数组内存时遇到问题,所以我认为这是一个原因。
char string1[257], string2[257];
scanf("%s", &string2);
string1[257] = '\0';
strncpy(string1, string2, 257);
string1[257] = '\0'; /* do I need to do that? */
最佳答案
绝对必要吗? 否,因为当您调用scanf
,strcpy
(除了strncpy
时,如果超过该大小,则需要手动将其设置为零),它将为您复制空终止符。反正这样做好吗? 并不是,它并不能真正解决缓冲区溢出的问题,因为这些函数无论如何都会超出缓冲区的大小。那最好的方法是什么?将C++与std::string
一起使用。
顺便说一下,如果您访问/写入string1[257]
,那将是无界的,因为您正在访问/写入大小为257的数组中的第258个元素。(它是从0开始的索引)
关于c - C中以Null结尾的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8202897/