在我们开始之前,是的,这是家庭作业,不,我不是想让其他人做我的功课。我有一个问题是让某人输入最多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&gt; = 0; z - ){}”似乎绝对没有做任何事情。但是,如果我删除或评论它,我的程序决定任何输入不是二进制数。如果有人能告诉我为什么需要这个循环和/或如何删除它,我将非常感激。谢谢:))
答案 0 :(得分:3)
在你的循环中:
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] = {};
至于外来循环修复它的原因 - 读取未初始化的值是未定义的行为,这意味着无法保证程序将执行的操作。