我的主要问题是当我从结构体 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);
}
-
如果要在
code
中存储 5 个字符,则大小必须为 6 个字节,包括