【问题标题】:Converting binary to number string to decimal number in C在C中将二进制转换为数字字符串到十进制数
【发布时间】:2012-08-11 19:57:29
【问题描述】:

我编写了一个程序,要求用户使用字符串输入一个数字,然后程序将该数字转换为十进制,但是当我编译(使用 -lm)并运行 a .out,我得到一个分段错误(核心转储),不确定在哪里查看或如何修复它,还有一个问题我需要什么才能打印转换结果(printf(“某事..” )) ?

#include <stdio.h>
#include <string.h>
#include <math.h>

int main()
{

char string[100];
int s;
char a;
char j;
int sum;

printf("B = B to D\n");
printf("D = D to B\n");
printf("choose which one to convert to:");
scanf("%c%c", &a, &j);

if (a == 'B')
{
    printf("enter binary number to convert to decimal: ");
    scanf("%s", string);

    for(s = strlen-1; s >= 0; s--)
    {

            if(string[s] == '1')
            {
            sum = sum + pow(2,s);

            }
    }

}

return 0;

【问题讨论】:

  • strlen 调用不正确。

标签: c string binary decimal


【解决方案1】:

您可能想拥有strlen(string) - 1,而不是strlen - 1。我最好的猜测是您的程序将strlen 解释为函数指针,并且在那之后会发生疯狂的事情。

事实上,您可能对strtol 函数感兴趣,它似乎完全符合您的要求。

【讨论】:

  • 好的,谢谢,我认为修复了它,我没有任何错误,现在我坚持的最后一部分是打印程序转换的十进制数。我不确定要打印什么,我试过“printf(”十进制数是:“,总和);”但这只是一个疯狂的猜测......
  • 试试printf("the decimal number is: %d\n", sum); - %d 代表参数列表中的一个整数; \n 是一个新行。
  • 是的,大约一个月前才开始。还有一个大问题,当我运行它时,我得到一个巨大的数字,我尝试了 011,它给了我 7892986
  • 我没有得到 7892986 与您发布的代码和“011”输入,我得到 6。相同的值不能用于 char[] 下标和幂。它们应该被“反转”。如果下标为 0,则幂应为 (strlen() - (0 + 1)) 或 2。如果下标为 2,则幂应为 (strlen() - (2 + 1)) 0r 0。
  • sum = sum + pow(2,string_length - (s + 1));
【解决方案2】:

您使用 strlen 作为整数。我想你的意思是 strlen(string)

【讨论】:

    【解决方案3】:
    for(sum=0, j=0, s=strlen(string)-1; s >= 0; s--, ++j){
        if(string[s] == '1'){
            sum = sum + pow(2,j);
        }
    }
    printf("%d\n",sum);
    

    【讨论】:

      【解决方案4】:
      #include <stdio.h>
      #include <string.h>
      #include <math.h>
      #include <ctype.h>
      #include <stdlib.h>
      
      void reverse_string(char *string)
      {
         int string_length = strlen(string);
         char temp;
         int i;
         for (i = 0; i < string_length/2; i++)
         {
            temp = string[i];
            string[i] = string[string_length - (i + 1)];
            string[string_length - (i + 1)] = temp;
         }
      }
      
      int main()
      {
      
         char string[100];
         int s;
         char a;
         char j;
         int sum = 0;
         int string_length = 0;
         int number, original_number;
         int remainder;
         char binary_string[200];
         int i = 0;
      
         printf("B = B to D\n");
         printf("D = D to B\n");
         printf("choose which one to convert to:");
         scanf("%c%c", &a, &j);
         a = toupper(a);
         if (a == 'B')
         {
            printf("enter binary number to convert to decimal: ");
            scanf("%s", string);
      
            string_length = strlen(string);
            for(s = strlen(string)-1; s >= 0; s--)
            {
               if(string[s] == '1')
               {
                  sum = sum + pow(2,string_length - (s + 1));
               }
            }
            printf("%s in binary is %d\n",string,sum);
         }
         else if (a == 'D')
         {
            printf("enter positive decimal number to convert to binary: ");
            scanf("%s",string);
            number = atoi(string);
            original_number = number;
            if ( number < 0 )
            {
               printf("ERROR: only positive numbers please\n");
               return 1;
            }
            do
            {
               remainder = number % 2;
               if ( remainder == 0 )
                  binary_string[i] = '0';
               else
                  binary_string[i] = '1';
               number = number / 2;
               i += 1;
            }
            while (number > 0);
            binary_string[i] = '\0';
            reverse_string(binary_string);
            printf("decimal %d is %s in binary\n",original_number,binary_string);
         }
         return 0;
      }
      

      【讨论】:

      • 老兄,我认为我的腻子搞砸了... a.out, B> 11 = 6880483 我不断得到这个,它不会改变。即使是你的程序。
      • 能不能做一个只打印argc的小程序?
      • hmm 我做了一个使用 argc 和 argv 的程序,但我对它们不太好。
      • #include int main(const int argc, const char *const argv[]) { fprintf(stdout,"开始 %s 传递了 %d 个参数(包括 pgm 名称)\n ",argv[0],argc); }
      • 啊啊啊啊啊啊!我明白了!,如果我初始化总和,它将修复我的代码中的所有内容。感谢您的帮助。现在我尝试将十进制转换为二进制,我不想只是复制你的程序:P
      【解决方案5】:

      strlen 使用不当。我认为您想做类似 strlen(string)-1 的事情。顺便说一句,您的逻辑无法转换小数部分。检查此代码:

      #include <stdio.h>
      #define MAX 1000
      
      int main()
      {
          double fraDecimal=0.0,dFractional=0.0 ,fraFactor=0.5;
          long dIntegral = 0,bIntegral=0,bFractional[MAX];
          long intFactor=1,remainder,i=0,k=0,flag=0;
          char fraBinary[MAX];
      
          printf("Enter any fractional binary number: ");
          scanf("%s",&fraBinary); 
          while(fraBinary[i]) //Separating the integral and fractional parts
          {
      
            if(fraBinary[i] == '.')
                flag = 1; //If dot is found start taking the fractional part.
            else if(flag==0)
                bIntegral = bIntegral * 10 + (fraBinary[i] -48); 
                /* char - 48 to get the numerical value.*/
            else
                bFractional[k++] = fraBinary[i] -48;
            i++;
          }
      
          while(bIntegral!=0){
           remainder=bIntegral%10;
           dIntegral= dIntegral+remainder*intFactor;
           intFactor=intFactor*2;
           bIntegral=bIntegral/10;
          }
      
          for(i=0;i<k;i++){
           dFractional  = dFractional  + bFractional[i] * fraFactor;
           fraFactor = fraFactor / 2;
          }
      
          fraDecimal = dIntegral + dFractional ;
      
          printf("Equivalent decimal value: %Lf",fraDecimal);   
          return 0;
      }
      

      来源: C Program to Convert Binary into Decimal Number

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-07
        • 2013-11-24
        • 1970-01-01
        • 2017-02-23
        • 2014-08-03
        • 1970-01-01
        • 2018-01-03
        • 2014-11-07
        相关资源
        最近更新 更多