超级基本代码:为什么我的循环没有中断?

Super basic code: Why is my loop not breaking?

for(int i=0;i<50;i++,size++)
{
    cin >> inputnum[i];
    cout << size;
    if(inputnum[i] == '.')
    {
        break;
    }
}

break打断了输入流但是size一直在输出。

大小的输出是012345678910111213...474849

我尝试将 size++ 放入循环中,但没有任何区别。之后的大小将等于50,这意味着它经历了完整的循环。

我忘了解释我在循环中添加了 cout << size debug/check 为什么即使我只输入了 3 个数字,它在循环后输出为 50。

我怀疑 inputnumint 的数组(或其他一些数字类型)。当您尝试输入 '.' 时,实际上没有任何内容进入 inputnum[i] - cin >> inputnum[i] 表达式实际上失败并将 cin 置于失败状态。

因此,当输入 '.' 字符时,inputnum[i] 不会改变,并且 break 永远不会被执行。

这是一个小而完整的程序中对您的代码稍作修改的版本,该程序演示了如何使用 !cin.good() 跳出输入循环:

#include <iostream>
#include <ostream>

using namespace std;

int main()
{
    int inputnum[50];
    int size = 0;

    for(int i=0;i<50;i++,size++)
    {
        cin >> inputnum[i];
        if (!cin.good()) {
            break;
        }
    }

    cout << "size is " << size << endl;    
    cout << "And the results are:" << endl;

    for (int i = 0; i < size; ++i) {
        cout << "inputnum[" << i << "] == " << inputnum[i] << endl;
    }

    return 0;
}

此程序会将输入收集到 inputnum[] 数组中,直到遇到 EOF 或无效输入。

什么是inputnum?确保它是 char[]!!使用 clang++ 可以编译并完美运行:

#include <iostream>

int main() {
  int size = 0;
  char inputnum[60];
  for(int i=0;i<50;i++,size++) {
    std::cin >> inputnum[i];
    std::cout << size;
    if(inputnum[i] == '.')  {
      break;
    }
  }
  return 0;
}

(在我的例子中输出如下:)

a
0a
1s
2d
3f
4g
5.
6Argento:Desktop marinos$ 

只要您在循环中针对 char 测试 char 而不是其他东西,您的代码就可以接缝。是否 inputnum 是某个整数值?如果是这样,那么您的测试子句将始终评估为 false 除非 inputnum 匹配数值 '.' 被隐式转换为..

编辑

显然您确实在尝试将 char 放入 int[]。尝试以下操作:

#include <iostream>

int main() {
  using namespace std;
  int size = 0;
  int inputnum[50];
  char inputchar[50];
  for(int i=0;i<50;i++,size++) {
    cin >> inputchar[i];
    inputnum[i] = static_cast<int>(inputchar[i]); // or inputnum[i] = (int)inputchar[i];
    cout << size << endl; // add a new line in the end
    if(inputchar[i] == '.')  break;
  }
  return 0;
}

那么这可能又是一项实验室作业,在实际程序中我永远不会这样编写代码。 Tat 将取决于要求,但我更喜欢使用 STL 容器和算法或字符串流。如果被迫以较低级别的 C 风格工作,我会尝试弄清楚“.”的数量。转换为(简单地通过 int a = '.'; cout << a;`)并将该数字直接放在测试子句中。然而,这样的代码可能很简单,但在我看来也是 BAD,它不安全,特定于实现,而不是真正的 C++。