提问者:小点点

当我执行它时,获取“名称”的scanf会跳过它自己。为了让它不这样做,我做了哪些更改?


#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.

共3个答案

匿名用户

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 );
       ^^^^^^^^^^ 

注意格式字符串中的前导空格。它允许跳过空格字符。

匿名用户

  • “吃”第一个输入\n:
scanf("\n%[^\n]", s[i].name);

祝你好运

提示

  • 限制输入长度:I[^\n]限制要读取的字符数。
  • 将for循环结束条件更正为:i