我正在使用名为'student'的结构编写一个简单的C程序。这是我的代码
#include<stdio.h>
#include<stdlib.h>
struct student {
char name[50];
int id;
float marks_1;
float marks_2;
};
void main(){
int num,a,i;
printf("Enter number of students\n");
scanf("%d",&num);
struct student s[num];
for(i=0;i<num;i++)
{
a=i+1;
printf("Enter name of student number %d\n",a);
scanf("%[^\n]%*c",s[i].name);
}
}
当我运行程序时,我能够正确输入学生人数,但之后我无法输入与每个学生相对应的姓名。这是我得到的输出。
Enter number of students
2
Enter name of student number 1
Enter name of student number 2
RUN FINISHED; exit value 2; real time: 1s; user: 0ms; system: 0ms
可能是什么问题?任何帮助表示赞赏
答案 0 :(得分:3)
scanf("%d",&num);
离开您键入的换行符,将输入发送到输入缓冲区中的程序。因此
的第一次迭代for(i=0;i<num;i++)
{
a=i+1;
printf("Enter name of student number %d\n",a);
scanf("%[^\n]%*c",s[i].name);
}
立即找到换行符并扫描空字符串。
在扫描之前使用换行符,方法是将第一种格式更改为"%d%*c"
,或者在名称扫描格式的开头添加一个空格以跳过初始空格。
答案 1 :(得分:2)
将scanf("%[^\n]%*c",s[i].name);
更改为scanf(" %[^\n]%*c",s[i].name);
。注意在说明符之前给出的空间消耗stdin中剩下的最后一个输入字符。
答案 2 :(得分:2)
Scanf功能不接受输入
如果scanf()
不起作用,请使用fgets()
:
fgets(s[i].name, sizeof(s[i].name), stdin);
如果/当你没有充分,正确地理解它是如何工作的时候,请远离scanf()
,因为它使用起来并不直观,所以说。 (如果你不够小心也不安全,在这种情况下,你不是。代码容易出现缓冲区溢出。)
答案 3 :(得分:0)
我不确定你在这里要做什么:
scanf("%[^\n]%*c",s[i].name);
但请尝试将其替换为:
scanf("%50[^\n]s",s[i].name);
答案 4 :(得分:0)
读取c中包含空格的行使用fgets (name, 100, stdin);
这是完整的代码:
#include<stdio.h>
#include<stdlib.h>
struct student {
char name[50];
int id;
float marks_1;
float marks_2;
};
void main(){
int num,a,i;
printf("Enter number of students\n");
scanf("%d",&num);
struct student s[num];
for(i=0;i<num;i++)
{
a=i+1;
printf("Enter name of student number %d\n",a);
fgets (s[i].name, 50, stdin);
}
}
scanf
会一直读到第一个空格,但不是fgets
,但是,如果您在使用fgets
时按Enter键,它将被存储在字符串也是。所以你需要在之后将其删除