需要一些帮助,在我的期间循环中找到逻辑错误
Need some help finding a logical error in my while loop
我正在学习C ,我正在使用我使用的书中进行一些练习。其中一个要求编写一个程序,询问用户要添加多少个数字。然后提示用户要添加或输入'|'的数字一旦完成。然后将数字推入向量。该程序的一部分要求检查向量的大小是否等于原始数量的输入项目,这就是我不断遇到错误的地方。
cout << "Please enter the numbers and | once you are done: ";
while(true)
{
for(int num; cin >> num; )
{
if(num == '|')
{
break;
}
ints.push_back(num);
}
if(ints.size() != n)
{
cout << "There are more or less numbers in the vector than originally specifiedn"
<< "Vector will be cleared; please re-enter the values: ";
ints.clear();
continue;
}
else
{
break;
}
}
问题是,如果输入数量关闭,则该消息将进入无限循环,我不确定如何修复它。
编辑:n是用户想要输入的值数量中的变量。
谢谢!
num
是整数, cin >> num
不会提取 |
符号。比较num == '|'
可能无法按预期工作,因为即使用户未输入任何|
符号,num
也可能具有|
ASCII符号的数值。您应该正确处理最终标记:
// loop will break when user enters `|` because it is not an integer
// setting failbit of cin
for(int num; cin >> num;)
{
ints.push_back(num);
}
cin.clear(); // reset failbit making cin able to read again
// check the end marker entered by user
{
string end_marker;
cin >> end_marker;
if("|" != end_marker)
{
// use of endl will flush the stream ensuring that
// printed text won't stuck in the buffer
cout << "Please use | as end marker" << endl;
continue;
}
}
这是我实现它的方式。我担心您的循环中的逻辑。我被教导要尽可能避免while(true)
。您知道代码应如何工作背后的逻辑。通过更多的练习,您将开始认识到您需要使用的条件。我相信有更好的方法可以做到。但这就是我尝试的方式。
但是要回答您的问题,失败的主要原因是因为整数无法将自己与字符进行比较。
if(num == '|')
不起作用,因为NUM是整数而不是字符。
通常,我会在类中实现此功能,并且由于全局变量没有高度关注,因此我创建了自己的名称空间。但是,您必须自己完成其余的逻辑:
#include <iostream>
#include <vector>
#include <string>
namespace global
{
std::vector<std::string> strings;
std::vector<int> ints;
std::string a = " ";
int num = 0;
}
void doWork()
{
std::cout << "Please enter the number of integers you would like to add up: ";
std::cin >> global::num;
std::cout << "Please enter the numbers and | once you are done: ";
while (global::a != "|")
{
std::cin >> global::a;
global::strings.push_back(global::a);
}
global::strings.pop_back();
for(auto &e : global::strings)
{
global::ints.push_back(std::stoi(e));
}
}
int main()
{
doWork();
if(global::ints.size() != global::num)
{
std::cout << "Size of vector does not match the size specified. Clearing vector" << std::endl;
global::ints.clear();
global::strings.clear();
global::num = 0;
global::a = " ";
doWork();
}
}
我做了一个char的向量,并将其转换为整数,这样您就可以添加它们。While循环应检查|
,而不是总是运行true。然后,它将检查矢量的大小,如果不匹配,请将其清除,并要求您再次进行。这是我想到的最好的方法。
编辑:正如VTT指出的那样,char
一次只能执行一个字符。我已经将其转换为字符串以处理转换。
编辑2:将global::num
和global::a
的值重置为失败结束时默认值以防止崩溃。
- 带有开关语句的 do-while 循环 -- 无穷循环错误
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 我在 c ++ 中有一个循环错误
- 无法发现嵌套的循环错误
- CPP 在读取结构数据时无限循环错误?
- 虽然循环错误:"Uninitialized local variable used"
- 如何修复关卡顺序遍历问题(二叉树)的无限循环错误
- 随机密码生成器的C++循环错误"以非零状态退出"
- <BadPtr> 循环错误
- 试图在C++中验证双精度有效输入的循环错误
- c++中的switchcase无限循环错误
- 文件IO循环错误
- for循环错误地输出指数
- 输入 Ctrl+Z 结束阅读单词将导致循环错误
- C++教授无法弄清楚的循环错误
- C++If循环错误
- 建议处理while循环错误
- 使用自动输入循环错误"auto must have an initializer"
- 输入数字时出现循环错误
- C++ "if"循环中的循环错误