使用scanf()
将数据存储到联合中时,我遇到了一个奇怪的问题。
这是我的代码
#include <stdio.h>
union Student
{
float score;
char grade;
};
int main(void)
{
union Student jack;
printf("Enter student score : ");
scanf("%f", &jack.score);
printf("Score : %f", jack.score);
jack.score=0;
printf("Enter student grade : ");
scanf("%c", &jack.grade);
printf("Grade : %c", jack.grade);
}
我得到以下输出
searock@searock-desktop:~/Desktop$ ./union
Enter student score : 12
Score : 12.000000Enter student grade : Grade :
但如果我将代码更改为:
#include <stdio.h>
union Student
{
float score;
char grade;
};
int main(void)
{
union Student jack;
printf("Enter student grade : ");
scanf("%c", &jack.grade);
printf("Grade : %c\n", jack.grade);
printf("Enter student score : ");
scanf("%f", &jack.score);
printf("Score : %f\n", jack.score);
}
它给出了确切的输出[正确的输出]。我知道这不是一个很好的例子,但有人可以解释我出了什么问题吗?
修改后的代码:在格式字符串之前添加\ n。 [scanf(“\ n%c”,&amp; ch);]
#include <stdio.h>
union Student
{
float score;
char grade;
};
int main(void)
{
union Student jack;
printf("Enter student score : ");
scanf("%f", &jack.score);
printf("Score : %f", jack.score);
jack.score=0;
printf("Enter student grade : ");
scanf("\n%c", &jack.grade);
printf("Grade : %c", jack.grade);
}
答案 0 :(得分:2)
区别在于字符串中的\n
。这些可以防止字符串缓存在输出缓冲区中,而是立即显示在屏幕上。
答案 1 :(得分:2)
在第一个示例中,第一个scanf()
读取的数字最多但不包括换行符(假设您不键入空格和换行符;如果这样做,它将继续等待输入,直到您提供数字或非数字 - 其中空格等不算数字或非数字)。然后带有“scanf()
”格式说明符的第二个%c
不会跳过空格(与大多数其他格式说明符不同)并读取换行符(假设您在数字结束后立即键入换行符;如果你键入了别的东西 - 白色空格或字母,也许,它读取那个字符),完全忽略你在第二行输入的任何内容。 (实际上,当我运行代码时,它不会等待我为第二批输入输入任何内容。尝试输入“3.14 + C”或“3.14C”和换行符。)
在第二个示例中,第一个scanf()
读取第一个字符。第二个scanf()
跳过空白区域,包括换行符,直到找到一个数字或某个绝对不是数字的内容(如字母)。
这是大多数人避免scanf()
的原因的美丽示范;很难对它提供令人满意的控制。你最好阅读行(可能使用fgets()
;绝对不使用gets()
),然后用sscanf()
解析它们。然后,您将获得两个示例的理智行为。
请注意,您的问题与使用union
完全无关;你的代码在工作方式上很好。您的问题与scanf()
。
次要建议:当打印输出行时 - 除了提示之外 - 在格式字符串的末尾包含换行符。
答案 2 :(得分:1)
在第一个示例中,您读取一个浮点数,然后读取下一个字符,该字符将是浮点数之后的换行符(您在输入浮点数后按Enter键)。
在第二个示例中,scanf()
格式说明符包含该换行符,因此第一个scanf()
读取一个字符后跟一个换行符,第二个scanf()
读取一个浮点数后跟一个换行符。