C语言 Printf 两次输出相同的数组



我的主要问题是当我从结构体 Item s 打印时,s.name 打印了两次。

法典:

#include <stdio.h>
struct Item{
    char code[5];
    char name[40];
};
int main(){
    FILE *f;
    struct Item s;
    //Open file
    f = fopen("ex.txt", "r");
    //Read from file
    fscanf(f, "%5c;%[a-zA-Z ]n", s.code, s.name);
    //Print from file
    printf("%s %s", s.code, s.name); //Main problem here
    fclose(f);
}

输入(例如.txt):

AB011;Hello World

输出应为:

AB011 Hello World

但相反的是:

AB011Hello World Hello World

这是怎么回事?

附加说明:我需要为此使用 fscanf,以便我可以了解它是如何工作的。

在调用您正在使用的fscanf

"%5c;%[a-zA-Z ]n"

作为格式说明符。格式说明符的%5c部分读取 5 个字符以s.code 。这不会为终止空字符留出空间。

将其用作参数以printf %s说明符会导致未定义的行为。 %s需要一个以空结尾的字符串。

应将 code 的大小更改为使用 6 个字符,然后在fscanf行后用空字符终止它。

#include <stdio.h>
struct Item{
    /// CHANGED HERE 
    char code[6];
    char name[40];
};
int main(){
    FILE *f;
    struct Item s;
    //Open file
    f = fopen("ex.txt", "r");
    //Read from file
    fscanf(f, "%5c;%[a-zA-Z ]n", s.code, s.name);
    /// CHANGED HERE 
    s.code[5] = '';
    //Print from file
    printf("%s %s", s.code, s.name);
    fclose(f);
}
  1. 如果要在code中存储 5 个字符,则大小必须为 6 个字节,包括终止符。

  2. 对于 scanf %[5]c - 正好读取 5 个字符,并且不添加终止

如果指定了 1 以外的宽度,则该函数将读取精确宽度字符,并将它们存储在作为参数传递的数组的连续位置。末尾不附加空字符。

您需要做的是在最后自己添加

//Read from file
fscanf(f, "%5c;%[a-zA-Z ]n", s.code, s.name);
s.code[5] = '';

最新更新