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

xu3bshqb  于 2023-03-29  发布在  其他
关注(0)|答案(1)|浏览(82)

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

ecfdbz9o1#

你所描述的症状是典型的副本失控的症状,然而,你的问题的真实的根源几乎肯定不在你所展示的代码中。
您所展示的代码唯一可能的问题是strncpy()不保证输出(目标)字符串以null结尾。这不会对所展示的代码造成伤害(它不会做任何不恰当的事情),但是其他期望字符串以null结尾的代码在没有确保空间的情况下轻松地复制它可能会践踏其他内存,因为字符串不是以null结尾的。
如果输入(源)字符串的长度大于指定的空格(在本例中大于TICKET_NAME_LEN字节),则user_input.ticket_name不会以null结尾,除非是意外。如果输入(源)字符串的长度小于指定的空格,则user_input.ticket_name将以null填充到长度TICKET_NAME_LEN字节。
如果这就是问题所在,一个非常简单的解决方法是添加以下行:

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

strncpy()之后(或者甚至在strncpy()之前,但是更常规的是在strncpy()之后)。
但是,要遇到这个问题,您必须尝试将41个或更多字符的名称复制到结构的票证名称成员中。
更有可能的是,其他事情是你的麻烦的原因。

ISO/IEC 9899:2011 §7.24.2.4 strncpy函数

strncpy函数从s2指向的数组复制不超过n个字符(空字符后面的字符不被复制)到s1指向的数组。308)如果复制发生在重叠的对象之间,行为是未定义的。
¶3如果s2指向的数组是一个比n短的字符串,空字符将被附加到s1指向的数组中的副本,直到所有n字符都被写入。
308)因此,如果s2指向的数组的前n个字符中没有空字符,则结果将不会以空结尾。

相关问题