c语言中的scanf函数的\n一定要谨慎添加,会导致读取字符串的时候读取不完

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 会等待直到从输入流中读取到非空白字符(非空格、非制表符、非换行符)才开始读取。这通常会导致程序看起来像是在等待第二次输入,尽管实际上它只是在等待非空白字符。


结束~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值