当我在代码中询问“是否要输入更多查询?输入 (y/n)”时,我尝试通过按“y”输入第二个查询作为输入时出现以下错误:
在抛出“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;
}
请帮助我的代码有什么问题。
最佳答案
您的问题是输入流中残留换行符。
当系统提示您继续时,请按 Y``[ENTER]
。
您的输入流如下所示:
+---+------+
| Y | '\n' |
+---+------+
您执行 cin >> in;
从流中提取 Y
。您的流现在看起来像:
+------+
| '\n' |
+------+
转到循环的顶部,您的程序执行 getline
,它会读取直到找到 \n
。由于输入流有一个(见上文),getline
返回一个空字符串。
可以通过检查 getline
之后的字符串来验证它的长度不为零来检测此错误。 “编写程序很容易。编写能够正常工作的健壮程序更加困难。” -- 托马斯·马修斯
解决方案:
解决方案是在从继续提示中读取输入后使用 cin.ignore(100000, '\n')
。这将从流中提取 \n
,以便您的输入流“刷新”并准备好接受新的输入如您所愿。
关于c++ - 在C++中接受多个字符串作为输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28569731/