c ++ strncpy意外输出

时间:2018-04-21 05:10:45

标签: c++ string

我正在检查函数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.

3 个答案:

答案 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的缓冲区,而不是

  1. 指定确切的最大长度(对于* printf,它是例如“%15.15s”;我找不到C ++ iostream的直接等价物。)
  2. 使用NUL显式填充此字符串后的字节,或者保证任何类似strncpy(dest,src,len)的调用都具有strlen(src)&lt; = len-1。
  3. 的前提条件。

    目前,您的程序在分配的字符数组后打印一些不可预测的(可能是垃圾)字符,因此,结果不稳定,具体取决于平台,编译器,优化级别等,包括系统崩溃和数据丢失的可能性:(

    为了更安全地使用C字符串,我强烈建议选择一些

    1. strlcpystrlcat(OpenBSD来源)。
    2. strcpy_s依此类推(C TR)。
    3. 任何具有数组和长度结构的方法,没有典型的警告(甚至切换到带有string的C ++)。