所以我有这段代码,但我不知道为什么代码中的两行被尖峰读取。这两行标有以下注释:
#include <iostream>
#include<stdio.h>
using namespace std;
class publication{
char title[20];
int price;
public:
void getdata(){
cout<< "Enter the price of the book";
cin>>price;
cout<< "Enter the title"; #this line 1st
gets(title); #this is not running
}
void putdata(){
cout<<price;
puts(title);
}
};
class Tape:public publication{
float play;
public:
void getdata(){
cout<< "Enter play"; #this line 2nd
cin>>play;
}
void putdata(){
cout<<endl<<play;
}
};
int main()
{
publication p;
p.getdata();
p.putdata();
Tape t;
t.getdata();
t.putdata();
book b;
b.getdata();
b.putdata();
}
现在我不明白为什么我跳过了第16和47行。我检查了语法,一切都很好。该程序没有错误。我为C ++使用代码块和gnu gcc编译器。 This is the image
在此图像中,您可以看到两行代码都是自动编译的,而无需输入标题。删除了一些与问题无关的代码行。
答案 0 :(得分:1)
这不是IDE或编译器的问题。不要怪可怜的人CodeBlocks:(
我不知道是什么提示您使用程序中的获取和放入。如果您最关心的是优化,请尝试将std::ios::sync_with_stdio(false);
与cin
也不要使用gets
,因为如果您不小心的话,它可能导致缓冲区溢出。请改用fgets
。参见cplusplus和stackoverflow
现在,问题来了,看起来像第16行和第47行被省略的真正原因是由于代码中的打印语句和消息不正确。似乎唯一被跳过的行是gets(title);
。实际上,一切都已执行。
为什么跳过获取(标题)?
因此,当您将价格输入为12时,它实际上将存储为12\n
在输入缓冲区中。现在,在读取12
之后,缓冲区中仍然有\n
,因为cin
不会像cin.getline
那样读取新行,并且gets
会看到新行作为终止符。参见gets
因此使用cin.ignore(numeric_limits<streamsize>::max(), '\n');
我已经重新格式化了您的代码。见下文。
请注意,我使用了fgets
,它将换行符视为有效字符,并且标题中包含了\n
。参见fgets
using namespace std;
class publication {
char title[20];
int price;
public:
void getdata() {
cout << "Enter the price of the book"<<endl;
cin >> price;
cout << "Enter the title" << endl;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
fgets(title, 20, stdin);
}
void putdata() {
cout << "Price is " << price << endl;
cout << "Title is "<< title;
}
};
class Tape :public publication {
float play;
public:
void getdata() {
cout << "Enter play"<<endl;
cin >> play;
}
void putdata() {
cout << "Play is " << play << endl;
}
};
int main()
{
publication p;
p.getdata();
p.putdata();
Tape t;
t.getdata();
t.putdata();
}