结构体的字符串输入要求和运行时错误

在今天一题中,发现一些不会的内容。
题目要求输入如下
输入格式:
输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。
输出格式:
在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。
输入样例:
3
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
25.0

这时候如果我们用

gets((*(a+i)).name);
scanf("%lf",&(*(a+i)).price);

是无法实现对内容的输入的
倘若在之前写下

scanf("\n");
  gets((*(a+i)).name);
  scanf("%lf",&(*(a+i)).price);

在每次输入之前输入一个换行,就可以实现内容的输入

然后就是关于运行中错误的问题
这时候通常都是因为越界导致的
比如题目要求书长为30个字符长度,不应该直接
struct book { char name[30]; double price; };
因为在字符的最后有一个**\0**符号要占用一个位置
于是正确应该是

struct book
{
 char name[31];
 double price;
};

这是很容易让我出现问题两个情况。
最后是总代码

#include <stdio.h>
#include <string.h>
struct book
{
 char name[31];
 double price;
};
int main()
{
 int n,i,max,min,k1,k2;
 scanf("%d",&n);
 struct book a[10];
 for(i=0;i<n;i++)//在输入字符有一定的问题 
 {
  scanf("\n");
  gets((*(a+i)).name);
  scanf("%lf",&(*(a+i)).price);
 }
 
 for(i=0;i<n;i++)
 {
  if(i==0)
  {
   max=(*(a)).price;min=(*(a)).price;
   k1=0;k2=0;
  }
  else
  {
   if((*(a+i)).price>max)
   {
    max=(*(a+i)).price;k1=i;
   }
   if((*(a+i)).price<min)
   {
    min=(*(a+i)).price;k2=i;
   }
  }
 }
 printf("%.2lf, %s\n",(*(a+k1)).price,(*(a+k1)).name);
 printf("%.2lf, %s",(*(a+k2)).price,(*(a+k2)).name);
 return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值