打印到文本文件时字符串重复

String duplicates when printed to text file

我正在尝试将一个句子字符串写入一个文本文件,但是当我这样做时它会重复或出现其他问题。为什么会这样,如何让它只打印一次?

节目摘录:

FILE *memberAdd;

typedef struct {
char id[5], name[100];
} Member;
Member reg;

strcpy(reg.id, "M0001");
printf("Name: ");
rewind(stdin);
scanf("%[^\n]", reg.name);

memberAdd = fopen("member.txt", "a");
fprintf(memberAdd, "%s %s\n", reg.id, reg.name);
fclose(memberAdd);

当我运行上面的文本文件中输出(reg.name输入是Test Name):

M0001Test Name Test Name

这个:

char id[5];

strcpy(reg.id, "M0001");

是缓冲区溢出,strpcy()会在末尾写入0终止符,溢出ìd数组。你得到未定义的行为。要修复它,可以缩短 ID 字符串,当然也可以增加数组的大小。

在你的代码中

  strcpy(reg.id, "M0001");

off-by-one. you cannot store a string like "M0001" (5 chars and a null-terminator) in an array of 5 chars using strcpy(). You're accessing beyond the allocated memory, this causes undefined behavior.

引用 C11,章节 §7.24.2.3

The strcpy function copies the string pointed to by s2 (including the terminating null character) into the array pointed to by s1. [...]

因此,这意味着目标必须能够容纳源字符串,包括空终止符。事实证明,你 运行 内存不足。 :)

如果您打算将 char 数组用作 字符串 ,则还需要内存来存储空终止符。在这种情况下,您可以增加成员 id 维度来保存终止空值,例如

 char id[6];

每个 C 字符串都需要由一些 NUL 字节终止(即 (char)0)。

所以 "M0001" 需要 6(不是 5!)字节。而且您的 char id[5] 字段不够宽。你得到一个 buffer overflow, an instance of undefined behavior。你应该声明

 char id[6];

至少作为 Member 中的一个字段。我实际上建议把它做得更大,也许 char id[8];