Scanf功能不接受输入

时间:2013-08-22 12:56:09

标签: c scanf

我正在使用名为'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

可能是什么问题?任何帮助表示赞赏

5 个答案:

答案 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键,它将被存储在字符串也是。所以你需要在之后将其删除