Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,因此它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
我正在尝试将句子字符串写入文本文件,但是当我这样做时它会重复或类似。为什么会这样,如何使它只打印一次?

程序摘录:

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):


  M0001测试名称测试名称

最佳答案

在你的代码中

  strcpy(reg.id, "M0001");


off-by-one。您不能使用"M0001"在5个chars的数组中存储类似char(5个strcpy()和一个空终止符)的字符串。您正在访问超出分配的内存的位置,这会导致undefined behavior

引用C11,第§7.24.2.3章


  strcpy函数复制s2指向的字符串(包括终止null
  字符)放入s1指向的数组中。 [...]


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

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

 char id[6];

关于c - 打印到文本文件时字符串重复,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47923067/

10-11 22:39
查看更多