代码之家  ›  专栏  ›  技术社区  ›  lefrost

打印到文本文件时字符串重复[关闭]

  •  -2
  • lefrost  · 技术社区  · 7 年前

    我试图将一个句子字符串写入文本文件,但这样做时它会重复或出现其他情况。为什么会这样,我如何才能让它只打印一次?

    节目节选:

    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测试名称测试名称

    3 回复  |  直到 7 年前
        1
  •  2
  •   Sourav Ghosh    7 年前

    在您的代码中

      strcpy(reg.id, "M0001");
    

    off-by-one . 无法存储 一串 喜欢 "M0001" (5 chars 和一个空终止符),在5的数组中 char s使用 strcpy() . 您正在访问超出分配的内存,这会导致 undefined behavior .

    引用 C11 ,第§7.24.2.3章

    这个 strcpy 函数复制 s2 (包括终止null 字符)插入 s1 . [...]

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

    如果计划使用 烧焦 数组作为 一串 . 在这种情况下,您可以增加成员 id 用于保存终止null的维度,如

     char id[6];
    
        2
  •  2
  •   unwind    7 年前

    这是:

    char id[5];
    
    strcpy(reg.id, "M0001");
    

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

        3
  •  1
  •   Basile Starynkevitch    7 年前

    每个C字符串都需要由一些 努尔 字节(即。 (char)0 ).

    所以 "M0001" (不是5!)字节。还有你的 char id[5] 字段不够宽。你得到一个 buffer overflow ,的实例 undefined behavior . 你应该声明

     char id[6];
    

    至少作为一个字段 Member . 我实际上建议把它弄大一些,也许 char id[8];