使用ANSI C,屏幕在strncpy
之后变得混乱。此外,如果我尝试打印任何int
变量值变得不正确。但是,如果我在strncpy
之前移动打印行一切正常。
有人知道为什么吗?
#define TICKET_NAME_LEN 40
struct stock_data
{
char ticket_name[TICKET_NAME_LEN+1];
};
struct stock_data user_input;
char tname[TICKET_NAME_LEN+1] = "testing it";
strncpy(user_input.ticket_name, tname, TICKET_NAME_LEN);
答案 0 :(得分:2)
您所描述的症状是经常失控的副本。但是,问题的真正根源几乎肯定不在您展示的代码中。
您显示的代码唯一可能的问题是strncpy()
不保证输出(目标)字符串为空终止。这不会对所显示的代码造成伤害(它不会做任何不适当的事情),但是其他需要字符串为null的代码终止,它会轻易地复制它而不确保空间可能会占用其他内存,因为字符串不为null终止。
如果输入(源)字符串长于指定的空间(在这种情况下长度超过TICKET_NAME_LEN个字节),则user_input.ticket_name
除非意外,否则不会以空值终止。如果它更短,那么user_input.ticket_name
将被空填充到TICKET_NAME_LEN字节的长度。
如果这是问题,一个非常简单的解决方法是添加以下行:
user_input.ticket_name[TICKET_NAME_LEN] = '\0';
strncpy()
之后(或甚至之前,但更常规的做法)。
但是,要遇到此问题,您必须尝试将41个或更多字符的名称复制到结构的故障单名称成员中。
更有可能是其他因素导致你的麻烦。
ISO / IEC 9899:2011§7.24.2.4
strncpy
函数¶2strncpy函数复制不超过
n
个字符(跟随null的字符) 从s2
指向的数组到指向的数组,不会复制字符s1
。 308)如果在重叠的对象之间进行复制,则行为未定义。¶3如果
s2
指向的数组是一个短于n
个字符的字符串,则为空字符 附加到s1
指向的数组中的副本,直到n
个字符为止 写入。308)因此,如果s2指向的数组的前n个字符中没有空字符,则结果不会以空值终止。