num;) { 如果(num='|') { 打破 } 内部推回(num); } 如果(整数大小()!=n) { cout,c++,infinite-loop,C++,Infinite Loop" /> num;) { 如果(num='|') { 打破 } 内部推回(num); } 如果(整数大小()!=n) { cout,c++,infinite-loop,C++,Infinite Loop" />

需要帮助查找while循环中的逻辑错误吗 我正在学习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 specified\n" << "Vector will be cleared; please re-enter the values: "; ints.clear(); continue; } else { break; } } cout>num;) { 如果(num='|') { 打破 } 内部推回(num); } 如果(整数大小()!=n) { cout

需要帮助查找while循环中的逻辑错误吗 我正在学习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 specified\n" << "Vector will be cleared; please re-enter the values: "; ints.clear(); continue; } else { break; } } cout>num;) { 如果(num='|') { 打破 } 内部推回(num); } 如果(整数大小()!=n) { cout,c++,infinite-loop,C++,Infinite Loop,num是一个整数,cin>>num不会提取符号。比较num=''.''.'可能无法按预期工作,因为num可能具有ascii符号的数值,即使用户没有输入任何符号。您应该正确处理读取的结束标记g: // 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);

num
是一个整数,
cin>>num
不会提取
符号。比较
num=''.''.'
可能无法按预期工作,因为
num
可能具有
ascii符号的数值,即使用户没有输入任何
符号。您应该正确处理读取的结束标记g:

// 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;
    }
}
//当用户输入`|`时,循环将中断,因为它不是整数
//设置cin的故障位
用于(int-num;cin>>num;)
{
内部推回(num);
}
cin.clear();//重置故障位,使cin能够再次读取
//检查用户输入的结束标记
{
字符串结束标记;
cin>>末端标记;
如果(“|”!=结束标记)
{
//使用endl将冲洗流,确保
//打印文本不会卡在缓冲区中

cout下面是我如何实现它的。我担心while循环中的逻辑。我被教导避免
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();
    }   

}
#包括
#包括
#包括
命名空间全局
{
std::向量字符串;
std::向量整数;
std::string a=“”;
int num=0;
}   
无效销钉()
{   
std::cout>global::num;
std::cout>global::a;
global::strings.push_back(global::a);
}
全局::strings.pop_back();
for(自动&e:global::strings)
{
全局::内部推回(std::stoi(e));
}
}   
int main()
{
销钉();
如果(全局::ints.size()!=global::num)
{

std::cout
num
是一个整数,
cin>>num
不会提取
符号。比较
num=''/code>可能无法按预期工作,因为
num
可能具有
ascii符号的数值,即使用户没有输入任何
符号。@VTT确定吗?因为它可以与co一起工作输入正确。一旦它读入|,它就会中断,并实际继续累加所有数字。我认为“”表示可以作为int读取的字符值。此外,练习要求使用|中断,因此这不是我的问题。只需尝试输入
124
(即
的数值),它将打破循环。错误的一点是,您的数字收集循环在读取第一个数字之前运行一次迭代。只需将其设置为
while(true)
,并从其内部的
cin
读取。您的问题是
cin
进入错误状态并停止读取进一步的输入。您需要清除此状态,请参阅
std::istream::ignore
std::istream::clear
。此代码仍然是错误的,因为它将读取单个字符而不是整数。即i如果用户输入123
global::ints
将包含3个数字
1
2
3
@VTT,我现在将其编辑为使用
std::string
而不是
char
。我正在试图解决一个问题,当程序清除向量并再次请求用户输入时,程序会不断崩溃。@VTTGram现在应该可以完美地运行了。我仍然认为这是处理它的最佳方式。它绝对不漂亮,我更愿意为此创建一个类,以便更好地处理全局变量,但这比使用
while(true)
循环来处理逻辑要安全得多。感谢您指出我的错误。