【问题标题】:C++ extraneous for loop needed for program to run successfully程序成功运行所需的 C++ 无关循环
【发布时间】:2014-10-31 08:56:51
【问题描述】:

在我们开始之前,是的,这是家庭作业,不,我不想让其他人来做我的家庭作业。我遇到了一个问题,让某人输入最多 7 位的二进制数,然后将该数字从二进制更改为十进制。虽然我肯定没有使用最有效/最好的方法,但我相信我可以让它发挥作用。让我们看一下代码:

#include <iostream>
#include <math.h>

using namespace std;

int main() {
    char numbers[8];
    int number = 0, error = 0;

    cout << "Please input a binary number (up to 7 digits)\nBinary: ";

    cin.get(numbers, 8);
    cin.ignore(80, '\n');

    for (int z = 7; z >= 0; z--){}
    cout << "\n";

    for (int i = 0, x = 7; x >= 0; x--, i++){
        if (numbers[x] <= 0){ // if that is an empty space in the array.
            i--;
        }
        else if (numbers[x] == '1'){
            number += pow(2, i);
        }
        else if (numbers[x] != '0'){ // if something other than a 0, 1, or empty space is in the array.
            error = 1;
            x = -1;
        }
    }
    if (error){ // if a char other than 0 or 1 was input this should print.
        cout << "That isn't a binary number.\n";
    }
    else{
        cout << numbers << " is " << number << " in decimal.\n";
    }
    return 0;
}

如果我运行此代码,它将完美运行。然而,在快速浏览代码时,这个“for (int z = 7; z >= 0; z--){}”似乎什么也没做。但是,如果我删除或注释掉它,我的程序会认为任何输入都不是二进制数。如果有人能告诉我为什么需要这个循环和/或如何删除它,将不胜感激。谢谢:)

【问题讨论】:

  • 如何使用调试器先单步执行,检查实际发生的情况。
  • 您似乎假设numbers 数组在字符串结尾后将全为零,但只有紧跟在字符串后面的一个字符将设置为零。尝试初始化您的数组:char numbers[8] = {}.
  • 在不同阶段打印变量通常在这种情况下也很有帮助。你说得对,这条线应该什么都不做,这意味着正在发生更微妙的事情。看看这段代码,我的钱是缓冲区溢出(终止空字节?)
  • @πάντα ῥεῖ 很好的第一个想法,虽然更令人费解的是,当我调试它时,它可以工作。但是,如果我只是正常运行它,它会打印出它不是二进制数。
  • 读取一个未初始化的值是未定义的行为,所以所有的赌注都没有。

标签: c++ loops binary


【解决方案1】:

在你的循环中:

for (int i = 0, x = 7; x >= 0; x--, i++){
    if (numbers[x] <= 0){ // reads numbers[7] the first time around, but
                          // what if numbers[7] hasn't been set?
        i--;
    }

如果输入的长度少于七个字符,您可能会读取未初始化的值。这是因为numbers 数组未初始化,cin.get 仅在字符串的最后一个字符之后放置一个空终止符,而不是整个数组的其余部分。修复它的一种简单方法是初始化您的数组:

char numbers[8] = {};

至于为什么外部循环修复它 - 读取未初始化的值是未定义的行为,这意味着无法保证程序会做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多