我正在检查函数strncpy的字符串操作函数。我有7个输出而不是3个,任何人都可以解释?非常感谢。
char x[] = "just see that.";
char y[15];
char z[10];
char l[14];
strcpy(y, x);
cout << "The string in array x is: " << x
<< "\n The string in array y is: " << y << '\n';
strncpy(z, x, 9);
z[9] = '\n';
cout << "The string in array z is: " << z << endl;
strncpy(l, x, 13);
l[13] = '\n';
cout << "The string in array l is: " << l<< endl;
输出有7行,如下所示
The string in array x is: just see that.
The string in array y is: just see that.
The string in array z is: just see
just see that.
The string in array l is: just see that
just see
just see that.
答案 0 :(得分:3)
z[9] = '\n'
或l[13] = '\n'
字符串未以空值终止。因此,打印它们可能会导致读出界限和未定义的行为。
答案 1 :(得分:3)
如果要终止null,则应使用'\ 0'而不是'\ n'
答案 2 :(得分:2)
strncpy
非常具体,如果指定缓冲区大小小于或等于源字符串长度,它不会自动终止(使用NUL
== '\0'
)目标缓冲区。 OTOH如果源字符串更短(len-2或更小),它会使用NUL填充更多的目标缓冲区字节。最初,strncpy
被设计为填充已使用的外部I / O的缓冲区,因此在不检测NUL的情况下比较确切的字节数。对于“通常”的字符串操作,不是一个“方便”的功能,不得用于此类目标。
结果,你不打印一个充满strncpy
的缓冲区,而不是
目前,您的程序在分配的字符数组后打印一些不可预测的(可能是垃圾)字符,因此,结果不稳定,具体取决于平台,编译器,优化级别等,包括系统崩溃和数据丢失的可能性:(
为了更安全地使用C字符串,我强烈建议选择一些
strlcpy
,strlcat
(OpenBSD来源)。strcpy_s
依此类推(C TR)。string
的C ++)。