我做了这个节目,它让用户ADRESS,姓名和工作。 然后,它把它全部合并为一个字符串,并输出字符串。 (我知道有更好的方法来做到这一点)
char str[600];
char adrs[200];
char name[10];
char wrk[200];
cout<<"Enter your name and press ENTER: ";
cin.getline(name,10);
cout<<"\nEnter your adress and press ENTER:";
cin.getline(adrs,200);
cout<<"\nEnter your workplace and press ENTER:";
cin.getline(wrk,200);
strcpy(str,"My name is ");
strcat(str,name);
strcat(str,"\nand i live at ");
strcat(str,adrs);
strcat(str, "\nI also work at ");
strcat(str, wrk); strcat(str, "\n\n");
cout<<str<<endl;
在这里,当我写超过10个字符的名称的程序确实需要前9个字符用户输入如我所料,但之后,它跳过所有接下来的cin.getline()
这是在程序并进入输出str
和结束程序。
为什么会出现这种情况,如何解决?
每次使用CIN的时间,直到它遇到一个换行符保存在内存中输入的每个字符。 的存储器中的该块被称为输入缓冲器。 你要先把电话cin.getline()
请求字符串10个字符,包括终止NULL字符。 然而,直到他打回车键CIN愉快地读取尽可能多的字符的用户类型。 如果用户键入超过900个字符,然后cin
存储在输入缓冲区中剩余的字符,并在后来的输入操作将使用它们。 例如,如果用户键入15个字符,您的呼叫到cin.getline()
存储你的c-字符串数组中的第9。 调用cin.getline()
将再次然后继续读一个已经进入了输入的其余部分。
要解决这个问题,你应该使用cin.ignore()
来跳过这个换行符。 我强烈建议你熟悉的C ++库的在线参考。 我最喜欢的两个是http://www.cplusplus.com和http://www.cppreference.com 。
编辑:为了我的回答是完整的,我还需要补充一点cin.getline()
将设置故障位,如果有比要求输入缓冲区更多的字符。 使用前cin
任何额外的输入操作,则必须调用cin.clear()
来清除失败位。
当读取一个过长的字符串ios_base::failbit
被设置为流和反流的所有后续操作将失败。 您需要将故障与复位ios::clear
:
if (cin.fail())
cin.clear();
错误被清除之后,你可能想忽略与行的其余部分istream::ignore
。
编辑:花了一个有用的提示,我要弄清楚如何使用ignore
正常。 这里的整体解决方案。
cout<<"Enter your name and press ENTER: ";
cin.getline(name,10);
if (cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
我建议把所有的代码放到一个功能,让你可以在每次之后调用它getline
。
cin.getline(name,10);
在读取从输入最多九个字,早期停止,如果有一个换行符。 如果有这些9个字符不换行,也不会触及行的其余部分,并在下次调用getline
将继续阅读该行的其余部分。
如果你想忽略输入行的其余部分,你也可以使用:
cin.get(name, 10);
cin.ignore(INT_MAX, '\n');
自由功能std::getline
上运行std::string
s,这是很容易对付比字符数组。 特别地, std::getline
允许任意-大的输入线。
试试这个:
std::string str;
std::string adrs;
std::string name;
std::string wrk;
cout<<"Enter your name and press ENTER: ";
std::getline(std::cin, name);
cout<<"\nEnter your adress and press ENTER:";
std::getline(std::cin, adrs);
...
你的逻辑是健全的,问题是,当你声明大小为10的字符数组,你实际上并没有获得10点放,你只能得到九个字符。 最后一个被保留,以表示该字符串的结尾。 [这里] [1]是一提的是,你想多读了关于这个问题:
只需要声明一个比你要的数量多字符。 有关于如何刷新流很多优秀的技巧,忽视了线等,你可以使用,以及其他地区。
祝好运!