为什么scanf无法正确读取输入?

时间:2019-02-22 14:37:00

标签: c

我不知道怎么了。我是否以错误的方式使用格式说明符?有人请帮助,我是编码的新手。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char name[20];int age;char grade;double gpa;char area[10];
    printf("User Input\n");
    printf("Enter your name: ");
    fgets(name,20,stdin);
    printf("Your name is %s\n",name);
    printf("Enter your age: ");
    scanf("%d\n",&age);
    printf("Your age is %d\n",age);
    printf("Enter you grade: ");
    scanf("%c\n",&grade);
    printf("Your grade is %c\n",grade);//Why is this giving an int output?
    printf("Enter your gpa: ");
    scanf("%f\n",&gpa);
    printf("Your gpa is %f\n",gpa);
    printf("Enter your area: ");
    scanf("%s\n",&area);
    printf("Your area is %s",area);//This shows grade input
    return 0;
}

输出

2 个答案:

答案 0 :(得分:1)

阅读fgets时正确使用了name。我建议还将fgets用于所有其他输入,然后从中解析出预期的值。例如:

char age_str[20];
fgets(age_str, 20, stdin);
age = strtol(age_str, NULL, 10);

这比直接将scanf用于非字符串输入更为可取,因为如果输入与格式字符串不匹配,它将保留在stdin中并破坏其他scanf的调用。

如果您想正确使用scanf

  • 检查其返回值以查看其是否与字符串中的格式说明符数量匹配。如果不是,则某些输入未成功读取。您可能要为此使用do / while循环。
  • 格式字符串以空格开头,例如" %c",因此stdin中剩余的所有空格都将被跳过。
  • Don't end your format strings with a newline

答案 1 :(得分:0)

关于scanf的一些事情要记住:

  • 大多数转换说明符,例如%s%d%f将跳过前导空格-%c%[不会。如果要读取下一个非空白字符,请使用" %c"-前导空白告诉scanf在读取下一个非空白字符之前跳过任何前导空白;

  • 对于您要尝试执行的操作,请勿在格式字符串中使用\n-这将导致scanf阻塞,直到您输入非空白字符为止;

  • 您不需要在&之类的数组表达式上使用area运算符;在大多数情况下,数组表达式会转换为指针表达式 1 。坦白地说,您应该使用area来阅读name,就像使用fgets一样阅读fgets(并且应该始终检查scanf( "%9s", area );的结果),或者应该指定最大字段说明符中的宽度:scanf(一个10元素的数组最多可容纳9个字符的字符串,因为必须为字符串终止符保留一个元素);

  • 您应该养成检查scanf( "%d %d", &x, &y )结果的习惯-它会返回成功转换和分配的次数。例如,如果xy都被成功读取,则EOF将返回2。如果发出文件结束信号或发生读取错误,它将返回scanf

  • %d将读取直到下一个与转换说明符不匹配的字符-IOW,如果您使用的是scanf,则%d将跳过任何前导空格,然后读取下一个不是十进制数字的字符。该字符保留在输入流中。这意味着,如果您使用123e456并输入scanf,则'e'会读到该123字符并将%d分配给目标。如果尝试再次使用scanf进行读取,则e将立即停止在该'e'上进行读取,并返回0,而不给目标分配任何内容(这称为匹配失败)。这将一直持续到您从输入流中删除该getchar为止(例如使用fgetc说明符使用scanf%c%s等。

  • 您需要确保参数的类型与格式说明符匹配。 char *期望使用%d类型的参数,int *期望使用%ffloat *期望使用%xunsigned int *期望%lfdouble *期望{{1}},等等。


  1. 这是我在评论中谈到的C的“深层不直观”方面之一。