我刚开始玩C而且遇到了这个问题。这是我的代码:
#include<stdio.h>
#include<conio.h>
struct person {
int i;
char name[100];
};
int main() {
struct person p[2];
clrscr();
for(int i=0;i<2;i++) {
printf("Enter i:\n");
scanf("%d",&p[i].i);
printf("Enter name:\n");
gets(p[i].name);
}
for(int j=0;j<2;j++) {
printf("ID: %d, Name: %c\n", p[j].i,p[j].name);
}
getch();
return 0;
}
以下是输出样本:
问题是,所有的char成员都没有被要求提供价值。
更新:
不过,我正在使用Turbo C ++版本3编译器。答案 0 :(得分:4)
你应该用%s
打印一个字符串; %c
会将指针解释为char
。 (严格来说,我认为结果是未定义的行为。)
答案 1 :(得分:3)
两件事:
%s
。以下是更正后的代码:
int main() {
struct person p[2];
for(int i=0;i<2;i++) {
printf("Enter i:\n");
scanf("%d",&p[i].i);
// Flush input buffer
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
printf("Enter name:\n");
gets(p[i].name);
}
for(int j=0;j<2;j++) {
printf("ID: %d, Name: %s\n", p[j].i,p[j].name);
}
getch();
return 0;
}
%c
需要char
,但您尝试传入字符串。具有不匹配类型的行为是未定义的行为。
输出:
Enter i:
1
Enter name:
asdf
Enter i:
2
Enter name:
zxcv
ID: 1, Name: asdf
ID: 2, Name: zxcv
答案 2 :(得分:1)
您可能需要在输入数字后清除输入缓冲区(在数字后按回车键,但是您没有读取该数字)
在您致电\n
后阅读scanf
之前,您可以阅读输入流:
while( ch = getchar() != '\n' && ch != EOF);
答案 3 :(得分:0)
您应该使用%s
代替。表达式p[j].name
是一个字符数组的指针,因此您无法使用%c
进行打印。