0

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

1 回答 1

2

您所描述的症状是失控副本的典型症状。但是,问题的真正根源几乎肯定不在您显示的代码中。

您显示的代码的唯一可能问题是strncpy()不保证输出(目标)字符串为空终止。这不会对显示的代码造成伤害(它不会做任何不利的事情),但是其他期望字符串为空终止的代码会轻松地复制它而不确保有空间可能会践踏其他内存,因为字符串不为空终止。

如果输入(源)字符串长于指定的空间(在这种情况下超过 TICKET_NAME_LEN 字节长),则user_input.ticket_name除非意外,否则不会以空值终止。如果它更短,user_input.ticket_name则将 null 填充到长度 TICKET_NAME_LEN 字节。

如果这是问题所在,一个非常简单的解决方法是添加以下行:

user_input.ticket_name[TICKET_NAME_LEN] = '\0';

strncpy().

但是,要遇到此问题,您必须尝试将 41 个或更多字符的名称复制到结构的票证名称成员中。

更有可能是其他原因造成您的麻烦。

ISO/IEC 9899:2011 §7.24.2.4strncpy功能

¶2 strncpy 函数从指向的数组复制不超过n字符(不复制空字符后的字符)到指向s2的数组 s1308)如果复制发生在重叠的对象之间,则行为未定义。

¶3 如果 指向的数组s2是比n字符短的字符串,则将空字符附加到 指向的数组的副本中s1,直到n所有字符都被写入。

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

于 2013-11-09T15:57:22.680 回答