我不知道怎么了。我是否以错误的方式使用格式说明符?有人请帮助,我是编码的新手。
#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;
}
答案 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
中剩余的所有空格都将被跳过。答案 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 )
结果的习惯-它会返回成功转换和分配的次数。例如,如果x
和y
都被成功读取,则EOF
将返回2。如果发出文件结束信号或发生读取错误,它将返回scanf
。
%d
将读取直到下一个与转换说明符不匹配的字符-IOW,如果您使用的是scanf
,则%d
将跳过任何前导空格,然后读取下一个不是十进制数字的字符。该字符保留在输入流中。这意味着,如果您使用123e456
并输入scanf
,则'e'
会读到该123
字符并将%d
分配给目标。如果尝试再次使用scanf
进行读取,则e
将立即停止在该'e'
上进行读取,并返回0,而不给目标分配任何内容(这称为匹配失败)。这将一直持续到您从输入流中删除该getchar
为止(例如使用fgetc
说明符使用scanf
或%c
或%s
等。
您需要确保参数的类型与格式说明符匹配。 char *
期望使用%d
类型的参数,int *
期望使用%f
,float *
期望使用%x
。 unsigned int *
期望%lf
,double *
期望{{1}},等等。