C Struct char成员得到一个奇怪的值
我刚开始玩C,就碰到了这个问题。这是我的密码:C Struct char成员得到一个奇怪的值,c,C,我刚开始玩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(
#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;
}
#包括
#包括
结构人{
int i;
字符名[100];
};
int main(){
结构人p[2];
clrsc();
对于(int i=0;i您应该使用%s
打印字符串;%c
将指针解释为字符
(严格来说,我认为结果是未定义的行为)。使用sscanf,因为scanf已被弃用。您还可以使用sscanf读取字符串,而不仅仅是数字。另外,%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");
sscanf("%d", &p[i].i);
printf("Enter name:\n");
sscanf("%s", 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;
}
#包括
#包括
结构人{
int i;
字符名[100];
};
int main(){
结构人p[2];
clrsc();
对于(int i=0;i两件事:
您需要清除输入缓冲区以防止它吃掉换行符
其次,您需要将格式字符串更改为%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;
}
您应该改用%s
。表达式p[j]。name
是指向字符数组的指针,因此无法使用%c
打印,您可能需要在键入数字后清除输入缓冲区(在数字后按return,但不读取该返回)
在调用scanf
后读取\n
之前,您可以一直读取输入流:
while( ch = getchar() != '\n' && ch != EOF);
您可能需要在键入数字后清除输入缓冲区(在数字后按enter键,但不读取该enter键)你绝对不应该使用get
。你的问题是特定于Windows的。Posix、Linux、MacOS没有
,你应该在编译器中启用所有警告。使用GCC,这是通过-Wall
标志完成的。user Mystical正确地解决了问题,但当我刷新页面时,它被删除了。是的,我刚刚做到了,但它仍然存在同样。它从未要求成员“name”。从程序的输出来看,似乎是这样。是的,你说得对。但主要问题是,每当要求char成员输入时,它都会跳转到另一个循环。fflush(stdin)
是未定义的行为。fflush
仅为输出流定义。Hi Mystical,出于某种奇怪的原因,当我接受你的答案时,会弹出一条消息,告诉我你的答案已被删除。因此,我所做的就是用你的答案更新我的问题。thanks@another.anon.coward指出了我犯的错误。所以我删除了给我是时候修正我的答案了。虽然fflush(stdin)
似乎在MSVC中工作,但显然这是标准中未定义的行为。我明白了。我真的很感谢你的帮助。你应该非常确定你写了什么或使用了编译器。
while( ch = getchar() != '\n' && ch != EOF);