当我尝试按下' y'输入第二个查询作为输入时,我收到以下错误当被要求&#34时;你想输入更多的查询吗?输入(y / n)"在我的代码中:
在抛出' std :: out_of_range'的实例后终止调用 what():basic_string :: substr 中止(核心倾销)
我的代码是:
#define SIZE 100
#include "SQLParser.cpp"
using namespace std;
int main() {
string s[SIZE];
SQLParser parser;
char in;
int i=0;
cout<<"Enter the input queries:";
do
{
//try
//{
std::getline(std::cin,s[i],'\n');
//cin.ignore(100000, '\n');
//cout<<" "<<s[i]<<"\n";
parser[i].sql=s[i];
parser[i].ProcessSQL();
cout<<"Do you want to enter more queries? Press (y/n):";
cin>>in;
cin.ignore(100000, '\n');
i++;
//}
/*catch (std::exception const &exc)
{
std::cerr << "Exception caught " << exc.what() << "\n";
}*/
}while(in!='n');
/*string s("CREATE TABLE tab(aa int,bb string, cc string)");
string s1("CREATE TABLE xyz(name string,gender char,age int,address string)");
parser.sql=s;
//parser1.sql=s1;
string s2("INSERT INTO tab(name,author,date) VALUES ('aa','bb','cc')");
//parser.sql = s2;
parser.ProcessSQL();
parser.sql = s1;
parser.ProcessSQL();
*/
return 1;
}
请帮助我的代码出现问题。
答案 0 :(得分:1)
您的问题是输入流中的剩余换行符
系统提示您继续时,按Y``[ENTER]
。
您的输入流如下所示:
+---+------+
| Y | '\n' |
+---+------+
您执行cin >> in;
从流中提取Y
。您的信息流现在看起来像:
+------+
| '\n' |
+------+
转到循环的顶部,程序会执行getline
,直到找到\n
为止。由于输入流有一个(见上文),getline
返回一个空字符串。
可以通过检查getline
之后的字符串来检测此错误,以验证它的长度不是零。 “编写程序很容易。编写能够正常工作的强大程序更加困难。” - Thomas Matthews
<强>解决方案:强>
解决方法是在从延续提示中读取输入后使用cin.ignore(100000, '\n')
。这将从流中提取\n
,以便您的输入流“刷新”并准备好按预期进行新输入。