【问题标题】:C++: Unwanted Number Added to OutputC++:向输出添加不需要的数字
【发布时间】:2019-10-25 08:06:02
【问题描述】:

我正在编写一个将十进制数转换为二进制和十六进制的 C++ 程序。 问题是由于某种原因,它每次都将数字“1875954912”连接到两种表示形式。

我已经尝试了很多东西 - 主要是改变程序计算 numArrayLength 的方式和我的 decToBase 函数中的 for 循环,但我还无法弄清楚为什么会发生这种情况。

顺便说一下,这个程序并不完整——它还没有将大于 9 的整数转换为十六进制表示的字母,但这不是我现在主要关心的问题。

这是我的代码:

#include <iostream>
#include <cmath>
using namespace std;

int howManyBitsNeeded(int someNum, int base) {
    int numOfDivisions = 0;
    while (someNum != 0) {
        someNum = floor(someNum / base);
        numOfDivisions += 1;
    }
    return numOfDivisions;
}


int decToBase(int someNum, int base) {
    int bitsNeeded = howManyBitsNeeded(someNum,base);
    int numArrayLength = bitsNeeded;
    int numArray[bitsNeeded];

    while (bitsNeeded > 0) {
        numArray[bitsNeeded] = (someNum % base);
        someNum = floor(someNum / base);
        bitsNeeded -= 1;
    }

    for (int k = (numArrayLength-1); k >= 0; --k) {
        cout << numArray[(numArrayLength - k)];
    }

}


int main() {
    int inpNum;

    cout << "Enter your number: ";
    cin >> inpNum;

    cout << "Binary representation: " << decToBase(inpNum,2) << endl;
    cout << "Hexadecimal representation: " << decToBase(inpNum,16);

    return 0;
}

这是输出的样子:

Enter your number: 25
Binary representation: 110011875954912
Hexadecimal representation: 191875954912

任何帮助将不胜感激!

【问题讨论】:

  • decToBase返回是什么意思? 它应该返回一些东西,还是只打印一些东西,或者两者都做?
  • 数组索引从0(不是1)开始,到size-1(不是size)结束——其中size是数组中的项目数量。阅读decToBase 函数时请记住这一点,特别是第一次执行numArray[bitsNeeded] = (someNum % base); 时,以及输出循环。
  • 您似乎访问了未分配的数组索引numArray。检查decToBase中的while循环。
  • 首先,当bitsNeeded 是一个变量时,int numArray[bitsNeeded] 不是标准 C++。请改用标准容器,例如 std::vector&lt;int&gt;。其次,您将数组索引视为基于 1(即元素 1bitsNeeded)。 C++ 中的数组索引是从零开始的 - 有效索引从 0 开始。访问结束时会产生未定义的行为。

标签: c++ output ostream


【解决方案1】:

您的decToBase 被声明为返回int,但它实际上并没有返回任何内容。你的编译器应该警告你这一点。由于您在这里没有返回任何内容,请将其返回类型更改为void。然后不要试图打印它的返回值,只需调用函数而不打印它:

std::cout << "Binary representation: ";
decToBase(inpNum, 2); // this already prints the number, no need to pass it to std::cout
std::cout << endl;

std::cout << "Hexadecimal representation: ";
decToBase(inpNum, 16);
std::cout << std::endl;

当然,您也可以更改函数以返回要打印的字符串,而不是在函数内部打印。

另外,这里有一个问题:

int numArray[bitsNeeded];

当您尝试在此处访问时,它超出了范围:

while (bitsNeeded > 0) {
        numArray[bitsNeeded] = (someNum % base);

稍后当您尝试打印它时。要摆脱这个错误,您必须将其更改为

numArray[bitsNeeded-1] = (someNum % base);

并在输出中将其更改为

cout << numArray[(numArrayLength - k -1)];

当您使用它时,我会推荐一个向量,而不是将其作为 VLA (which isn't part of C++ and only works if the compiler tolerates it) 使用:

std::vector<int> numArray(bitsNeeded+1); // include <vector> for this to work

此外,请注意整数除法已被截断,因此除非您打算稍后支持负数,否则您可以通过更改以下内容来消除有关隐式 doubleint 转换的警告:

someNum = floor(someNum / base);

到这里:

someNum /= base;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多