运行时输入内容后需要随便打一些字母结果才出来

问题遇到的现象和发生背景 运行结果出来要胡乱打几个字母才出来
问题相关代码,请勿粘贴截图 #include

#include
struct book
{
char name[50];
float price;
int classification;
};
int main() {
int n;
scanf_s("%d", &n);
struct book bo[100], bo1;
for (int i = 0;i < n;++i)
{
scanf_s("%s%f%d\n", bo[i].name,50,&bo[i].price, &bo[i].classification);
}
for (int q = 0;q < n - 1;++q)
{
for (int p = 0;q < n - p - 1;q++)
{
if (bo[q].price > bo[q + 1].price)
{
bo1 = bo[q];
bo[q] = bo[q + 1];
bo[q + 1] = bo1;
}
else if (bo[q].price == bo[q + 1].price)
{
if (bo[q].name[0] > bo[q + 1].name[0])
{
bo1 = bo[q];
bo[q] = bo[q + 1];
bo[q + 1] = bo1;
}
}
}
}
for (int i = 0;i < n;++i)
{
printf("%s,%.2f,%d\n", bo[i].name, bo[i].price, bo[i].classification);
}
system("pause");
return 0;
}

运行结果及报错内容

输入
3
program 35 1
history 35 2
cloudy-computing 57 1

sacvds
history,35.00,2
program,35.00,1
cloudy-computing,57.00,1
请按任意键继续. . .

scanf_s("%s%f%d\n", bo[i].name,50,&bo[i].price, &bo[i].classification);
改为
scanf_s("%s%f%d", bo[i].name,50,&bo[i].price, &bo[i].classification);
去掉输入串中的\n
因为添加\n的话,就要求你输入的时候也必须多一个换行符。所以你只输入一个换行符是不能结束输入的。最终有效地不是你随便输入几个字符,而是你再次按了回车键

楼主需要明白,printf 和 scanf 的区别:

  1. printf == print format 即格式化输出,本质是一个输出函数,所以在 printf("hello\n"); 中的 \n 就是输出换行符的意思
  2. scanf == scan format 即格式化扫描,本质是一个输入函数,所以在 scanf("%d\n", &var); 中的 \n 表示会去扫描输入是否有 \n

所以将scanf_s("%s%f%d\n", bo[i].name,50,&bo[i].price, &bo[i].classification);中的 \n 去掉即可
改为
scanf_s("%s%f%d", bo[i].name,50,&bo[i].price, &bo[i].classification);

如有用,望采纳(点亮技能勋章)感谢!



scanf的所有衍生出来的函数都具有个共同特点
比如
scanf
fscanf
sscanf
scanf_s
等等
这些函数默认都是以空格作为分隔的,直到遇到非空白字符它才会停止获取数据的。
这是这个函数的特性,不受个人作为影响的。

因为你在格式最后面放有换行符(也属于空白字符),
它就默认后面还要读取非空字符才会停止读取。

你可以试一下,最后如果最后换行不删的话,无论你输入多少个空白字符,它都不会停止的,直到输入非空白字符才会停止。

所以要想排除这个问题,必须要删掉最后的换行符。