1.发现问题:在练习结构体数组时,想要把信息读取到数组中,发现循环定义输入三次,结果每回都输入四次才能打印出来,检查了好长时间才看出来,原来是顺手打了个\n惹的祸。代码如下(原错误代码):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
struct Student
{
char name[20];
int age;
char sex;
float score;
char addr[30];
};
int main() {
//练习结构体变量
//这是结构体数组的练习
/*struct Student s[3] = {
{"Alice", 20, 'F', 90.5, "123 Main St"},
{"Bob",22 ,'M',85.0, "456 Elm St"},
{"Charlie", 21, 'F', 92.0, "789 Oak St"}
};*/
struct Student s[3];
for (int i = 0; i < 3; i++)
{
scanf("%s%d %c%f%s\n", &s[i].name, &s[i].age, &s[i].sex, &s[i].score, &s[i].addr);
}
for (int i = 0; i <3; i++)
{
printf("%s %d %c %f %s\n",s[i].name,s[i].age, s[i].sex, s[i].score, s[i].addr);
}
return 0;
}
2.解决方法:从 scanf
的格式字符串中移除 \n,如下图所示:
结果图:
3.原理:在 scanf
的格式字符串中,\n
并不是一个有效的分隔符,它实际上会被 scanf
忽略。但是,它后面的 scanf
会等待直到从输入流中读取到非空白字符(非空格、非制表符、非换行符)才开始读取。这通常会导致程序看起来像是在等待第二次输入,尽管实际上它只是在等待非空白字符。
结束~