我正在使用C ++进行Bjarne Stroustrup的原则和实践,并且我坚持一个特定的练习。确切的问题是:
"编写一个由while循环组成的程序(每次循环)读入两个整数然后打印它们。终止' |'输入。"
我认为下面的代码可以正常工作,但我一直在做一个永无止境的循环。
#include <iostream>
int main() {
int i1 = 0;
int i2 = 0;
while ((i1 != '|') || (i2 != '|')) {
std::cout << "Enter some nums YO (enter | to exit)\n";
std::cin >> i1 >> i2;
std::cout << i1 << i2;
}
}
答案 0 :(得分:1)
std::cin >> i1 >> i2;
告诉程序读取两个整数,因此程序在流中查找数字。如果输入“|”,则无法找到数字,并且流将进入故障状态。可以接受失败状态will need to be clear
ed和更多输入之前bad input ignore
ed的剩余部分。但是如果你为字符“|”加上数字编码(124假设ASCII编码),流输入和条件都将被满足,但现在不可能输入数字124和平均值124而不是'|'。
而是阅读std::string
s。如果两个字符串都不是“|”,请测试字符串是否为整数(可能是尝试将它们转换为integers with std::stoi
)。如果找到“|”,则退出循环。
MSalter的评论震撼了另一个比转到string
更简单的解决方案。如果读取了2个数字,则打印数字并要求更多。否则,清除读取非整数的错误并读入char
以测试“|”。这是一个非常简单和丑陋的剪辑:
#include <iostream>
int main()
{
int i1 = 0;
int i2 = 0;
char ch = ' '; // can be anything but |
do
{
std::cout << "Enter some nums YO (enter | to exit)\n";
if (std::cin >> i1 >> i2)
{ // we got nums, YO.
std::cout << i1 << i2; // print the nums, YO
}
else
{ // not nums, YO. Let's see if we got a |
std::cin.clear(); // clear the error
std::cin >> ch; //read for a '|'
}
} while (ch != '|' && std::cin); // loop until | is read or cin can't read a char
}
这很难看,因为像“auoaioafksdjnfkm”这样的输入会打印出每个角色的提示,而“klasdjfahs12938 2093854sjfljzlkfjzlk”会打印出过多的提示,并在中间某处打印出“129382093854”。
答案 1 :(得分:0)
int
存储一个数字。 '|'
是一个字符,然后使用char
来读取/存储它。
char i1;
char i2;
示例:
int main() {
char i1;
char i2;
while ((i1 != '|') || (i2 != '|')) {
std::cout << "Enter some CHARACTERS (enter '|' to exit)\n";
std::cin >> i1 >> i2;
std::cout << i1 << i2;
}
}
答案 2 :(得分:0)
循环继续,因为你在整数变量和字符值
之间进行比较while(i1!='|'||i2!='|)//does not work
因为i1和i2只能拥有数字值(0123456789)而不是charactes(a,b,c,!,ª,|)i1和i2永远不能取值'|'并且循环一遍又一遍地运行。 一件事应该有效:
int main() {
int i1 = 0;
int i2 = 0;
char c;//declare c
while (c!='|') {//if the value of c is not equal to '|' run the loop
cout << "Enter some 2 nums and a character YO (enter | to exit)\n";
cin >> i1 >> i2 >> c;//give a value to i1,i2 & c
cout << i1 << i2;
}
}
答案 3 :(得分:0)
从控制台读取一行文字。如果该行包含|
,则退出。否则,解析该行。
int main()
{
for (;;)
{
std::cout << "Enter some nums YO (enter | to exit)" << std::endl;
std::string s;
std::getline(cin, s);
if (s.find('|') != s.npos)
{
break;
}
std::istringstream ss(s);
int i1, i2;
ss >> i1 >> i2;
std::cout << i1 << ' ' << i2 << std::endl;
}
return 0;
}