这段代码是用C ++编写的,由于我不太了解它的原因,它写了两次。 我希望在输入一个随机字符后,它会显示一次char,而String也会显示一次。但我不认为这是输出。我错过了什么?
解决方案:添加cin.ignore()语句也会忽略读入的返回值。 让我的代码完成一次循环。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
char letter;
letter = cin.get();
while (letter!= 'X')
{
cout << letter << endl;
cout << "this will be written twice for ununderstandable reasons";
letter = cin.get();
}
}
实施例:
如果我要写入cmd scrn c
,我会得到一个c
返回+两次短语this will be written twice for ununderstandable reasons
。所以我认为是输出
c
this will be written twice for ununderstandable reasons
实际上是
c
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
答案 0 :(得分:2)
你忘记了换行符。 cin读取每个字符,其中包括您在输入字符后键入的换行符。 如果您不想要此行为,则必须专门检查换行符。
while (letter!= 'X')
{
if (letter == '\n')
{
letter = cin.get();
continue;
}
cout<<letter<<endl;
cout<<"this will be written twice for ununderstandable reasons";
letter= cin.get();
}
答案 1 :(得分:2)
您正在使用未格式化的get()
函数阅读每个字符,包括每次返回时的换行符。
根据您要执行的操作,您可以使用格式化输入(cin >> c
)来跳过所有空格;或者你可以测试每个角色并忽略像你不感兴趣的换行符;或者您可以使用getline(cin, some_string)
读取整行,然后处理它。
答案 2 :(得分:2)
当你输入一个字符时,新行字符(按下输入)也在输入缓冲区中。
如果找到了分隔字符,则不会从输入序列中提取分隔字符,并将其保留为要从流中提取的下一个字符(请参阅getline以获取放弃分隔字符的替代字符)。
在每cin.sync()
之后使用cin.get()
来清除缓冲区,你应该好好去。
答案 3 :(得分:2)
正如大家已经提到的,cin
每次点击输入时都会附加换行标记\n
。另一种解决方案是在每cin.ignore();
之后放置cin.get();
。
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
char letter;
letter = cin.get();
cin.ignore();
while (letter!= 'X')
{
cout<<letter<<endl;
cout<<"this will be written twice for ununderstandable reasons";
letter= cin.get();
cin.ignore();
}
}
答案 4 :(得分:2)
文本'这将被写两次..'不一定会打印两次。
输入'qwerty'+ ENTER,您的信息流将在其中显示“qwerty \ n”,您将看到此输出:
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
this will be written twice for ununderstandable reasons
正好字符串“qwerty \ n”中有很多字符。 问题是
cin.get()
将您键入的所有字符放入流/缓冲区(不是字母字符),但每次调用cin.get()时都会处理一个字符。
当您输入'abcXd'+ enter时,程序将在第3行打印并在X上停止。
答案 5 :(得分:1)
这是因为cin.get()也会读取new-line
个字符。尝试按Enter
不带任何符号或键入一些字符串,例如abc
。
你需要处理它,例如:
while (letter = cin.get()) {
if (!isalpha(letter)) { continue; }
// handling user inputted alpha
}