关于以下内容strncpy:http://www.cplusplus.com/reference/clibrary/cstring/strncpy/,它提到了以下内容:
没有空字符隐式附加到目标的末尾,因此如果源中的C字符串的长度小于num,则目标将仅以空值终止.
这句话是什么意思?
pax*_*blo 11
这意味着,例如,如果源字符串是20个字符加上空终止符并且strncpy指定少于21个字符,则目标字符串将不会附加空值.
这是因为它的工作方式:strncpy保证它将准确写入N个字节,其中N是传入的长度值.
如果源字符串的长度(无空字节)小于该字符串,则它将使用空值填充目标区域.如果它等于或大于,则不会将null添加到目标.
这意味着它在技术上可能不是你得到的C字符串.这可以通过以下代码解决:
char d[11]; // Have enough room for string and null.
strncpy (d, s, 10); // Copy up to 10 bytes of string, null the rest.
d[10] = '\0'; // Then append null manually in case s was too long.
Run Code Online (Sandbox Code Playgroud)
您分配11个字节(数组索引0..10),复制到10(索引0..9)然后将第11个(索引10)设置为null.
下面的图表显示了将各种大小的字符串写入10个字符区域的三种可能性,strncpy (d, s, 10)其中where .表示空字节:
s d
------------- ----------
Hello. Hello.....
Hello Fred. Hello Fred
Hello George. Hello Geor
Run Code Online (Sandbox Code Playgroud)
请注意,在第二种和第三种情况下,不会写入空字节,因此,如果将其d视为字符串,则可能会对结果感到失望.
该字符串"foo"有3个字符+ 1个空终止符(存储为"foo\0"),总长度为4.如果strncpy使用n=3(或更少)调用,它将不会在目标字符串的末尾追加空终止符,但会复制只"foo".由于缺少表示字符串结尾的空终止符,因此尝试打印结果字符串将导致未定义的行为.
你必须非常小心这一点,要么传递n一个大于最大值的源,要么自己添加null-terminator.