2

I am working on a simple C program using a struct named 'student'. Here is my code

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

    }

  }

When I run the program I am able to enter the number of students correctly, but after that I am not able to enter the name corresponding to each student. This is the output that I get.

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

What might be the problem? Any help appreciated

4

5 回答 5

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"或通过在名称扫描格式的开头添加一个空格来跳过初始空白。

于 2013-08-22T13:03:18.017 回答
2

更改scanf("%[^\n]%*c",s[i].name);scanf(" %[^\n]%*c",s[i].name);. 请注意在说明符之前给出的空间,以消耗标准输入中剩余的最后一个输入字符。

于 2013-08-22T12:59:53.477 回答
2

Scanf 函数不接受输入

如果scanf()不起作用,请使用fgets()

fgets(s[i].name, sizeof(s[i].name), stdin);

scanf()如果/当您对它的工作原理没有全面、正确的理解时,请远离它,因为它使用起来并不直观,可以这么说。(如果你不够小心,这也是不安全的,在这种情况下,你没有。代码容易出现缓冲区溢出。)

于 2013-08-22T13:04:05.887 回答
0

我不确定您要在这里做什么:

scanf("%[^\n]%*c",s[i].name);

但尝试将其替换为:

scanf("%50[^\n]s",s[i].name);
于 2013-08-22T12:58:30.160 回答
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,但是,如果您在使用时按 Enter,fgets它也将存储在字符串中。所以你需要在之后删除它

于 2013-08-22T13:05:40.390 回答