这个程序没有循环工作,但是当我实现循环时,我得到一个运行时错误。我想这可能与我的cin.getline有关,但我真的不知道:/任何帮助都会非常感谢你!
#include <iostream>
using namespace std;
#include <string>
#include <iomanip>
int main ()
{int ans, z;
z=1;
cout << "How many times would you like to execute this string program? " << endl;
cin >> ans;
while (z <= ans)
{
int x, i, y, v;
string answer1, str3;
string mystring, fname, lname;
i=0;
y=0;
cout << "Please enter your first and last name: ";
getline(cin, answer1);
cout << endl;
x=answer1.length();
for (int i = 0; i < x; i++)
{
cout << answer1[i] << endl;
if (isspace(answer1[i]))
{
y=i;
}
}
cout << endl << endl;
cout << setw(80) << answer1;
mystring = answer1;
v=answer1.find(" ", 0);
fname=mystring.substr(0, y);
lname=mystring.substr(v, x);
cout << "First name: " << fname << endl;
cout << "Last name: " << lname << endl;
mystring=lname+','+fname;
cout << setw(80) << mystring;
z++;
}
return 0;
}
答案 0 :(得分:1)
错误发生在这一行:
lname=mystring.substr(v, x);
其中v
恰好具有非常大的值。那么你的程序是如何实现的,v
如何获得这个值呢? v
的值为std::string::npos
,这是一个错误代码,在这种情况下,您所寻找的空间不存在。这种情况与格式化和未格式化输入之间的区别以及您正在混合它们的事实有关。
格式化输入意味着将输入流视为令牌流。前导空格 - 所有空格,无论是空格,制表符还是换行符 - 都会被跳过,并且令牌结束时,会输入。格式化输入的一个例子是
cin >> ans;
对于格式化输入,所有不适合其模式的内容看起来都一样。 std::istream::operator>>(int)
是否遇到空格,标签,换行符,'a'
或“z'
,这只是令牌的结尾,并且它会停止阅读。例如,如果你有
int x;
std::string s;
std::cin >> x >> s;
并输入输入123abc
,然后x
的值为123
,s
将为"abc"
。至关重要的是,这意味着如果用户回答
cin >> ans;
带有数字和换行符,数字后面遇到的字符 - 换行符 - 保留在流中。
相比之下,未格式化输入意味着将输入流视为字符流。对于未格式化的输入函数,空格只是另一个字符,除非未格式化的输入函数为它们定义了特殊含义,否则它将与任何其他字符一样对待它们。未格式化输入的一个例子是
getline(cin, answer1);
这是
的简写getline(cin, answer1, '\n'); // that is to say, the delimiter
// has a default value of '\n'
(只是为了清楚地表明换行符'\n'
在这种情况下具有特殊含义)。以这种方式使用的getline
将从流中读取,直到遇到换行符。
这就是你的问题所在。在上一个格式化的输入函数之后,流中还剩下您不关心的内容。它可能只是一个换行符(虽然如果用户提供123abc
,它将是abc\n
),在这种情况下,getline将为您提供一个空字符串 - 流中有一个空行,那么否则可以吗?
有几种方法可以解决这个问题。一个是说
#include <iostream>
#include <limits>
cin.ignore(numeric_limits<streamsize>::max(), '\n');
这实质上是说:忽略下一个换行符之前的所有内容(numeric_limits<streamsize>::max()
是cin.ignore
视为无穷大的非常大的数字。另一个是
cin >> ws;
其中说:“忽略下一个非空格字符的所有内容”,尽管这会忽略下一行中的前导空格,如果用户提供abc
,它将不会忽略123abc
。在你的情况下,我相信没有理由改变格式化输入的齿轮 - 你不需要一行,而是名字和姓氏。我建议使用
string fname, lname;
cin >> fname >> lname;
这也将消除其他错误(您使用错误代码作为字符串索引),因为您不必在字符串中搜索可能不存在的空格。
答案 1 :(得分:0)
待办事项
cin >> ans;
cin >> std::ws;
在while循环之前。另外,检查
v=answer1.find(" ", 0);
有 的std ::非营利组织
如果find不成功,则返回该值。