关于C++中遇到输⼊字符串中有空格的问题
没事做的⼀个c++的题⽬:
给定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
今天在做这道题⽬的时候,很快就把代码写了出来,但是各种格式问题,平台始终没让我通过。
主要的问题就是最开始不知道c++中的:
cin>>a[i].name;
是在终端输⼊⼀串字符串时,遇到空格或者换⾏就会直接停⽌,这个功能在做别的题⽬的时候时有⽤的但是在这道题⽬中带来了很多⿇烦。
其实⽤c语⾔的话这道题⽬很好解决,使⽤c语⾔中的get()函数
get()函数⽤例:
char a[10];
get(a);
直接读到换⾏符结束读取。
通过查到⼀个函数getline();
getline(cin,a[i].name);
但是还是出错。
出错原因分析
getline(cin,str)的读取原理是将以‘\n’ 为结束符完整读取的⼀⾏,’\n’灰度,所以当之前⽤cin读取⼀个字符串的时候,你会输⼊⼀个字符串,然后回车,那么getline(cin,str)读的时候灰度⼊这个回车,并判断结束了。
解决办法
在getline前⾯加⼀个函数cin.ignore()
这样⼀来,回车就会被忽略
另外⼀个问题就是:c++中的⼩数保留
相对于c中简单粗暴的⽅式:
eg:%f 格式化输出浮点型数据,在%之后加上“.n”即可。
例如:%.2f\n中的“.2”即保留两位⼩数;
不设定保留⼏位⼩数,则默认六位。
c++保留⼩数点位数
//头⽂件
#include <iomanip>
/
/第⼀种写法
cout<<setiosflags(ios::fixed)<<setprecision(2);
//直接写在要输出的语句前⾯
//第⼆种写法
cout.setf(ios::fixed);
cout<<setprecision(2);
//第三种写法
cout<<fixed<<setprecision(2);
*要保留⼏位⼩数setprecision(n)的括号⾥n就换成⼏。
*前两种写法是⼀样的,第三种是简化写的。
*上⾯的语句写⼀次就⾏了,对之后的数字都有效。
最后全部代码:
#include<iostream>
#include<string>
#include <iomanip>
using namespace std;
typedef struct book{
//char name[100];
string name;
double price;
}Book;
int main(){
int n;
cin>>n;
Book a[10];
for(int i=0;i<n;i++){
cin.ignore();
getline(cin,a[i].name);
//cin>>a[i].name;
cin>>a[i].price;
}
double MaxPrice = a[0].price;
double MinPrice = a[0].price;
for(int j=1;j<n;j++){
if(a[j].price>MaxPrice){
MaxPrice = a[j].price;
}
if(a[j].price < MinPrice){
MinPrice = a[j].price;
}
}
for(int i=0;i<n;i++){
if(MaxPrice==a[i].price){
cout<<fixed<<setprecision(2);
cout<<a[i].price<<", "<<a[i].name<<endl;        }
}
for(int i=0;i<n;i++){
if(MinPrice==a[i].price){
cout<<fixed<<setprecision(2);
cout<<a[i].price<<", "<<a[i].name;
}
}
return 0;
字符串长度不足补空格}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。