好吧,我已经在这几个小时了....
//after a character is entered, library routines are used to uppercase the
letters. loops the program until "1" is entered
char letter;
while (letter != '1')
{
cout << "Enter a letter: ";
cin.get(letter);
cout << char(toupper(letter)) << '\n';
}
一切正常,但它会“输入一封信:”两次......
这是一个示例输出
Enter a letter: h
H
Enter a letter:
Enter a letter: k
K
Enter a letter:
Enter a letter: a
A
我希望它看起来像这样
Enter a letter: h
H
Enter a letter: k
K
Enter a letter: a
A
你能帮忙解释一下为什么这样做....
答案 0 :(得分:8)
输入数据时,键入字母,然后按 ENTER 。这会将您的字母和返回字符(\n
)添加到流中。由于当仍有要从流中提取的字符时,cin.get()
不会等待您的输入,因此每隔一次传递都会获取\n
。
您可以通过添加cin.ignore
:
while (letter != '1')
{
cout << "Enter a letter: ";
cin.get(letter);
cin.ignore(256, '\n');
cout << char(toupper(letter)) << '\n';
}
替代方法是使用>>
运算符,因为cin.get
一次只检索一个字符:
while (letter != '1')
{
cout << "Enter a letter: ";
cin >> letter;
cout << char(toupper(letter)) << '\n';
}
答案 1 :(得分:3)
只需将cin.get(letter)
更改为cin >> letter;
,它就会按预期工作。
编辑:我想提供更多相关信息。 get()从流中提取一个字符,这会将换行符留在其中,就像其他人指出的那样。下一次调用get()将提取它并立即终止而不是等待输入,因为流仍然有数据。另一方面,>>
- 运算符完全取决于您在此处尝试执行的操作:从stdin读取值,直到按下返回键。因此它也会消耗换行符,导致下一次调用operator<<()
阻止,直到用户输入新数据为止。
注意:要记住的另一件事:>>
- 提取到字符串中将从流中提取最多一个字符,但它不会阻止用户输入更多字符按Enter键前的字符。这将产生一些输出,如下所示:
niko@lethal-guitar:~$ ./a.out
Enter a letter: a
A
Enter a letter: asas
A
Enter a letter: S
Enter a letter: A
Enter a letter: S
这是因为运算符删除了一个char和换行符,但保留了流中剩余的字符。这些将立即终止接下来的三个operator>>()
- 来电。
答案 2 :(得分:1)
对于初学者,因为你不检查cin.get
是否成功
或不。你几乎肯定会输出你的最后一个角色
读了两遍。你的循环应该是:
while ( letter != '1' && cin.get( letter ) ) ...
或
while ( cin.get( letter ) && letter != '1' ) ...
另请注意,在大多数系统上,cin.get()
将不会返回
你点击输入(假设从键盘输入)。所以你会
输出"Enter a letter: "
,然后等到输入键
被压了。然后你将循环而不等待,阅读全部
您输入的字符,直到您阅读'\n'
为止。那里
在C ++标准中没有字符输入的规定,
从一个系统来看,这样做的技术有很大的不同
到下一个。