【问题标题】:Scanf function not accepting inputScanf 函数不接受输入
【发布时间】:2013-08-22 12:56:08
【问题描述】:

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

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

【问题讨论】:

标签: c scanf


【解决方案1】:
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",或者在名称扫描格式的开头添加一个空格以跳过初始空白。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      Scanf 函数不接受输入

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

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

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

      【讨论】:

      • @fts 它正在工作。也许您应该适当地使用它。 此外,“不工作”根本不是描述性的。 究竟是什么它不起作用?
      • @H2CO3 fgets() 会将\n 放入s[i].name
      • @chux 是的,它会的。然后你写*strchr(s[i].name, '\n') = 0;,然后kaboom就消失了。在获取用户输入方面,fgets() 仍然优于 scanf()
      • @H2CO3 同意fgets() 的优越性。如发布的那样,答案会更好,包括您推荐的 post-fgets() 处理。
      • @chux 但不幸的是,我觉得不会。新用户在得到一个快速但有效的解决方案后的态度:“谢谢,它工作得很好,我再也不会回到这个问题了!”
      【解决方案4】:

      我不确定你想在这里做什么:

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

      但尝试将其替换为:

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

      【讨论】:

      • 那是扫描一个没有换行符的字符串。
      • @tim 我也想在我的“名字”中包含空格。例如。如果我输入“我的名字”然后打印结果,我会得到“我的”而不是“我的名字”。
      • @H2CO3 我不认识任何名字中包含换行符的学生:p
      • @fts 它确实返回“我的名字”;)
      • @TimvanElsloo 但是您肯定知道名字中包含空格的学生吗? "%s" 在跳过初始空白后在找到的第一个空白处停止。
      【解决方案5】:

      要读取 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 时按下回车,它也会存储在字符串中。所以你需要在之后删除它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-21
        • 1970-01-01
        • 2013-02-23
        • 2011-01-09
        • 2019-10-24
        • 2019-07-10
        相关资源
        最近更新 更多