查找书籍(缓冲区)

2023-12-18 19:32:17

给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。

输入格式:

输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。

输出格式:

在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。

输入样例:

3
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
25.0

输出样例:

25.00, Programming in Delphi
18.50, Programming in VB

代码:?

#include<stdio.h>
#include<string.h>
struct book
{
	char str[32];
	double a;
}stu[12];//定义一个结构体数组

int main()
{
	int n;
	scanf("%d", &n);
	getchar();
	for (int i = 0; i < n; i++)
	{
		fgets(stu[i].str, 32, stdin);
		stu[i].str[strcspn(stu[i].str, "\n")] = 0;//记住!!!
		scanf("%lf", &stu[i].a);
		getchar();//重点!!!
	}
	double b = stu[0].a;
	int c = 0;
	for (int i = 1; i < n; i++)
	{
		if (stu[i].a > b)
		{
			b = stu[i].a;
			c = i;
		}
	}
	b = stu[0].a;
	int d = 0;
	for (int i = 1; i < n; i++)
	{
		if (stu[i].a < b)
		{
			b = stu[i].a;
			d = i;
		}
	}
	printf("%.2f, %s\n", stu[c].a, stu[c].str);
	printf("%.2f, %s", stu[d].a, stu[d].str);
	return 0;
}

?注意:
1.fgets函数会读取指定数目的字符,包括换行符(如果输入字符串长度不超过指定的最大字符数),并将其保存在字符串中。它不会自动替换换行符为字符串的空字符,因此需要手动处理

stu[i].str[strcspn(stu[i].str, "\n")] = 0;

如果没有这段代码的话会输出成:

25.00, Programming in Delphi

18.50, Programming in VB

?

2.gets函数会读取输入直到遇到换行符('\n')为止,并且会将换行符替换为字符串的空字符('\0')。?

3.输入缓冲区:

scanf函数会在读取输入后将输入中的空格、制表符和换行符留在输入缓冲区中,这可能会导致后续输入函数读取到意外的字符。

fgets函数会读取输入中的所有字符,包括换行符,并将其存储在缓冲区中,因此不会留下多余的字符。

4.为什么要用getchar来读入一个回车:

getchar()函数会从输入缓冲区中读取一个字符。(与scanf联系起来了)当用户在键盘上输入字符后,这些字符会被存储在输入缓冲区中,getchar()函数会从缓冲区中读取一个字符并返回。如果输入缓冲区为空,getchar()函数会等待用户输入字符,直到用户按下回车键。因此,getchar()函数实际上是从输入缓冲区中读取字符,而不是直接从键盘读取。

?

文章来源:https://blog.csdn.net/Y2663438690/article/details/135068284
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。