ANSI C strncpy搞乱了屏幕输出和其他变量的值

时间:2013-11-09 14:00:50

标签: c ansi strncpy

使用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);

1 个答案:

答案 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.4strncpy函数

     

¶2strncpy函数复制不超过n个字符(跟随null的字符)   从s2指向的数组到指向的数组,不会复制字符   s1 308)如果在重叠的对象之间进行复制,则行为未定义。

     

¶3如果s2指向的数组是一个短于n个字符的字符串,则为空字符   附加到s1指向的数组中的副本,直到n个字符为止   写入。

     

308)因此,如果s2指向的数组的前n个字符中没有空字符,则结果不会以空值终止。