#include <stdio.h>
int b;
int main()
{
int a, c;
printf("Enter the number of students \n");
scanf("%d", &a);
struct studinfo{
char name[50];
int roll;
float marks;
};
struct studinfo s[10];
for(int i = 0; i <= a; i++)
{
printf("Enter the Name :\n");
scanf("%[^\n]s", s[i].name); //THIS ONE HERE
printf("\n");
printf("Enter the roll no. \n");
scanf("%d", &s[i].roll);
printf("\n");
printf("Enter the marks\n");
scanf("%f", &s[i].marks);
}
for(int i = 0; i<= a; i++)
{
printf("Name: %s\n", s[i].name);
printf("Roll no: %d\n", s[i].roll);
printf("Marks: %f", s[i].marks);
}
return 0;
}
Works when I remove the scanf to enter number of students.
#包括
int b; int main(){int a,c;printf("输入学生人数\n");
struct studinfo{
char name[50];
int roll;
float marks;
};
struct studinfo s[10];
for(int i = 0; i <= a; i++)
{
printf("Enter the Name :\n");
scanf("%[^\n]s", s[i].name);
printf("\n");
printf("Enter the roll no. \n");
scanf("%d", &s[i].roll);
printf("\n");
printf("Enter the marks\n");
scanf("%f", &s[i].marks);
}
for(int i = 0; i<= a; i++)
{
printf("Name: %s\n", s[i].name);
printf("Roll no: %d\n", s[i].roll);
printf("Marks: %f", s[i].marks);
}
return 0;
}
-> This happenes because the Scanf initially used takes everything except for '\n' which is later is read by the next scanf which skips when it reads a '\n'.
-> Ive tried Fgets and gets too but still doesnt work.
-
The output im getting is;
after I enter the number of students, it just skips the scanf to enter the name and just executes scanf to enter the roll no.
scanf(" %[^\n]", s[i].name);
scanf中的空白字符(空格、制表符等)(通常使用空格)读取连续的空白字符,直到出现非空白字符。所以这将解决问题。
%[]之后没有s。
对于初学者,您应该检查a
的值是否不大于10
,并且for循环中的条件应如下所示
struct studinfo s[10];
for(int i = 0; i < a; i++)
至于你的问题,那么在调用scanf
之后
scanf("%d", &a);
输入缓冲区包含与按下的键Enter对应的新行字符'\n'
。所以scanf
的这个调用
scanf("%[^\n]s", s[i].name);
读取一个空字符串。并且格式字符串中存在多余的s
字符。
相反你应该写
scanf( " %49[^\n]", s[i].name );
^^^^^^^^^^
注意格式字符串中的前导空格。它允许跳过空格字符。
scanf("\n%[^\n]", s[i].name);
祝你好运
提示