【问题标题】:Having trouble with converting a decimal number to a binary将十进制数转换为二进制时遇到问题
【发布时间】:2013-05-22 00:41:29
【问题描述】:

我正在制作一个程序,该程序通过代表字符串“APPLE”的每个字符的相应 ASCII 数字将用户输入的字符串(例如“APPLE”)转换为二进制数。例如 ascii 中的 A = 65 等。我创建了一个将字符串转换为二进制文件的函数,但它似乎不起作用。它在无限循环中显示“等效二进制数是:0031F240for A”,并给我“0031F240for”而不是二进制版本 65。我知道这个函数适用于将十进制数转换为二进制,因为我已经尝试过了,但我认为我的 bin[] 数组的实现搞砸了。任何帮助将不胜感激。

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <fstream>
using namespace std;

class RandomString
{
    private:
        string input;
        string bin[100];

    public:

RandomString() : bin(), input("")
{

}

void getData()
{
    cout << "Enter the word to be encoded into a binary file.";
    cin >> input;
}

void numToBin()
{
    int i = 0;
    int len = input.length();
    int num = int(input[i]);
    for(int i = 0; i < len; i++)
    {

        while(num != 0)
        {
            if (num % 2 == 0)
                bin[i].insert(0, "0");
            else
                bin[i].insert(0, "1");

            num = num / 2;
            cout << "The equivalent binary number is: " << bin << "for " << input[i] << endl;
        }
    }
}
void display()
{
}


};

【问题讨论】:

  • 我认为在这两种情况下我们都需要做`num = num / 2;`。我错了吗?
  • 是的,你是对的。在这两种情况下都应该是,这是我的错误。但是,它最终还是会吐出与输出相同的内容。
  • 什么是垃圾箱类型,我不明白。如果您使用string,则使用string str=""; 和条件str=str+(num%2==0?"0":"1");
  • 我必须为我的 bin 使用一个字符串类型的数组,因为如果用户输入另一个不同长度的单词,例如菠萝,那么我需要它将菠萝的所有字符转换为二进制。我已经编辑了我的帖子以包含我的所有代码。

标签: c++ arrays visual-c++ binary decimal


【解决方案1】:

我没有测试结果是否正确,但是这段代码将字符串转换为二进制。可能你必须修改它以适应 ASCII 代码。

void DecimalToBinary(char a,std::vector<char>& v)
{
  if(a==0)
      v.push_back(0);
  if(a==1)
      v.push_back(1);
  else
    {
      v.push_back(a%2);
      DecimalToBinary(a/2,v);
    }
}



int main()
{
  std::vector<char> v;
  std::string line;
  getline(std::cin,line);
  std::istringstream input(line);
  char c;
  while(input >> c)
    {
  DecimalToBinary(c,v);
    }

  std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout,""));  
}

首先,您的 while 循环永远不会停止,因为您没有在 while 循环内更改 i 的值,因此 int(input[i]) 始终具有相同的值,您必须在某处使用 breaki++,但是我不知道结果是否正确,我认为在这种情况下递归比while更好,但无论如何尝试以下:

   void numToBin()
{
    int i = 0;
    int len = input.length();
    int num = int(input[i]);
    for(int i = 0; i < len; i++)
    {

        while(int(input[i]) != 0)
        {
            if (num % 2 == 0)
          {
                bin[i].insert(0, "0");
        break;
          }
            else
            {
                bin[i].insert(0, "1");
                num = num / 2;
            }
            cout << "The equivalent binary number is: " << bin << "for " << input[i] << endl;
        }
    }
}

其次,std::cout &lt;&lt; bin 打印的是内存地址,而不是 bin 的内容。

【讨论】:

  • 您好,感谢您发布您的代码,但我知道如何使用矢量以及不使用什么...如果您能帮助我指出我的代码有什么问题,我将不胜感激。
  • @user2419691 输入是什么类型,字符串?你能发布你所有的代码吗?
  • 是的,它是一个类型字符串。我已经编辑了我的原始帖子以包含我的所有代码。
  • 你的 while 永远不会停止,你必须使用 break 但无论如何我不认为你的函数结果是正确的。同样在做std::cout &lt;&lt; bin 你打印一个内存地址,而不是数组@user2419691 的内容
  • 好的,我修复了我的cout &lt;&lt; bin[i],如果我的while循环的条件在完成从ASCII到二进制的转换后应该停止它,为什么我需要使用break?
【解决方案2】:
while(int(input[i]) != 0)
        {
            if (num % 2 == 0)
                bin[i].insert(0, "0");
            else
            {
                bin[i].insert(0, "1");

            }
            num = num / 2;// this line should be in both case.
            cout << "The equivalent binary number is: " << bin << "for " << input[i] << endl;
        }

我已经为这两种情况更改了num = num / 2。请检查一下。

【讨论】:

  • 是的,你是对的。在这两种情况下都应该是,这是我的错误。但是,它最终还是会吐出与输出相同的内容。
【解决方案3】:

您可能想要更改“bin”

cout

到'bin[i]'。

因为'bin'是一个字符串数组,也是字符串数组的指针/地址,所以'cout

【讨论】:

  • 感谢您的意见。在有人指出并立即这样做之后,我看到了我的错误。我的代码可以打印出 A 的二进制文件,但它不会打印出单词其余部分的二进制文件。它最终打印出“等效的二进制数是:P”等,一直到字符串的最后一个字符。
猜你喜欢
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2010-12-08
  • 2012-06-26
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多