查找书籍(缓冲区)
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!