将十进制数的每个数字转换为相应的二进制数

时间:2014-12-10 11:57:54

标签: c arrays binary c-strings

我需要将字符串“12345678”转换为值00010010001101000101011001111000(二进制值,左边没有零)。 所以我用c编写了这段代码,问题是当我运行它时什么也没做,只是等到有错误,直到我手动停止它。 有什么想法吗?

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

void reduce(char string[]) {
    int i=0, j=0, k=0, cnt=0, tmp=4, num;
    char arr[4], result[4*strlen(string)];
    for (i=0; i<strlen(string); i++) {
            num = atoi(string[i]);
            while (num != 0) {
                    arr[j++] = num%2;
                    num = num/2;
                    tmp--;
            }
            while (tmp != 0) {
                    arr[j++] = 0;
                    tmp--;
            }
            j--;
            for (k=i*4; k<(i*4+4); k++) {
                    result[k++] = arr[j--];
            }
            j = 0;
            tmp = 4;
    }
    printf("The result is: \n");
    for (i=0; i<4*strlen(result); i++) {
            printf("%d",result[i]);
    }
    printf("\n");
}

 int main() {
    char c[8] = "12345678";
    reduce(c);
    return 0;
}

6 个答案:

答案 0 :(得分:3)

代码中有很多小错误,这使得很难确定单个错误。主要问题似乎是您将二进制数字(01)与ASCII数字("0""1")混淆并且误用字符串函数。

  1. 如其他地方所述,char c[8] = ..是错误的。
  2. atoi(string[i])不起作用;它需要字符串,而不是 char 。使用`num = string [i] - &#39; 0&#39;;
  3. arr[..]获取值'num%2,即数值。最好使用'0'+num%2,这样它就是一个字符串。
  4. 您在{em>已经递增k
  5. 的循环内的result[k++]中增加k
  6. 在打印前添加result[k] = 0;,以便strlen正常工作
  7. 4*strlen(result)太过分了 - strlen就是它。
  8. 你不妨做一个简单的printf("%s\n", result);
  9. #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void reduce(char string[]) {
        int i=0, j=0, k=0, cnt=0, tmp=4, num;
        char arr[5], result[4*strlen(string)+1];
        for (i=0; i<strlen(string); i++) {
                num = string[i]-'0';
                while (num != 0) {
                        arr[j++] = '0'+num%2;
                        num = num/2;
                        tmp--;
                }
                while (tmp != 0) {
                        arr[j++] = '0';
                        tmp--;
                }
                arr[j] = 0;
                j--;
                for (k=i*4; k<(i*4+4); k++) {
                        result[k] = arr[j--];
                }
                j = 0;
                tmp = 4;
        }
        result[k] = 0;
        printf("The result is: \n");
        for (i=0; i<strlen(result); i++) {
                printf("%c",result[i]);
        }
        printf("\n");
    }
    
     int main() {
        char c[] = "12345678";
        reduce(c);
        return 0;
    }
    

    ..导致

    The result is: 
    00010010001101000101011001111000
    

答案 1 :(得分:1)

main()中,执行

char c[ ] = "12345678";

char c[9] = "12345678";

如果您想将c用作字符串。否则,它没有足够的空间来存储终止空字符。

在这里,我冒昧地相应地修改代码以便为您工作。检查以下代码。希望它是自我解释的。

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

void reduce(char string[]) {
        int i=0, j=0, k=0, cnt=0,  count = 0;           //count added, tmp removed
        char arr[4], result[ (4*strlen(string) )+ 1], c;    //1 more byte space to hold null
        for (i=0; i<strlen(string); i++) {
                c = string[i];
                count = 4;
                while (count != 0) {                        //constant iteration 4 times baed on 9 = 1001
                        arr[j++] = '0' + (c%2);            //to store ASCII 0 or 1 [48/ 49]
                        c = c/2;
                        count--;
                }
/*      //not required
                while (tmp >= 0) {
                        arr[j++] = 0;
                        tmp--;
                }
*/
                j--;
                for (k=(i*4); k<((i*4) +4); k++) {
                        result[k] = arr[j--];
                }
                j = 0;
                memset (arr, 0, sizeof(arr));
        }
        result[k] = 0;
        printf("The result is: %s\n", result);   //why to loop when we've added the terminating null? print directly.
/*
        for (i=0; i< strlen(result); i++) {
                printf("%c",result[i]);
        }
        printf("\n");
*/
}

int main() {
        char c[ ] = "12345678";
        reduce(c);
        return 0;
}

输出:

[sourav@broadsword temp]$ ./a.out 
The result is: 00010010001101000101011001111000

答案 2 :(得分:1)

从您的示例中可以看出,您尝试的转换是二进制编码的十进制而不是二进制。在这种情况下,您的解决方案有点过于复杂;您只需将每个数字转换为整数值,然后将位模式转换为ASCII 10

#include <stdio.h>

void reduce( const char* c )
{
    for( int d = 0; c[d] != 0; d++ )
    {
        int ci = c[d] - '0' ;

        for( unsigned mask = 0x8; mask != 0; mask >>= 1 )
        {
            putchar( (ci & mask) == 0 ? '0' : '1' )   ;
        }
    }
}

另一方面,如果您打算转换为二进制(而不是BCD),那么如果将整个字符串转换为整数,则可以直接将位模式转换为ASCII {{ 1}}和1如下:

0

答案 3 :(得分:0)

  1. 使用int num = atoi(c)将字符串转换为整数。
  2. 然后做

    int binary[50];
    int q = num,i=0;
    
    while(q != 0)
    {
       binary[i++] = q%2;
       q = q/2;
    }
    
  3. 打印您的二进制数组是相反的顺序将使您的二进制等效。 完整的计划:

    #include<stdio.h>
    
    
        int main(){
    
            char c[100];
            int num,q;
    
            int binary[100],i=0,j;
    
    
            scanf("%d",c);
    
            num = atoi(c);
            q = num;
    
    
            while(q!=0){
    
                 binary[i++]= q % 2;
    
                 q = q / 2;
    
            }
    
    
    
    
            for(j = i -1 ;j>= 0;j--)
    
                 printf("%d",binary[j]);
    
    
            return 0;
    
        }
    

答案 4 :(得分:0)

您可以使用以下缩小功能。

void reduce(char string[])
{
    unsigned int in = atoi(string) ;
    int i = 0, result[32],k,j;

    while (in > 0) {
        j = in % 10; 
        k = 0;
        while (j > 0) {
            result[i++] = j % 2;
            j = j >> 1;
            k++;
        }
        while (k < 4) {
            result[i++] = 0;
            k++;
        }
        in = in/10; 
    }
    printf("Result\n");
    for(--i;i >= 0; i--) {
        printf("%d", result[i]);
    }
    printf("\n");

}

12345678 输出将是 00010010001101000101011001111000 ,其中每个字符都以二进制格式打印。

答案 5 :(得分:0)

可能需要进行一些调整,但它确实可以完成工作。

#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
        int  i;
        int  n;
        char *str       = "12345678";
        const int  bit  = 1 << (sizeof(n)*8 - 1);

        n = atoi(str);

        for(i=0; i < sizeof(n)*8 ; i++, n <<= 1)
                n&bit ? printf("1") : printf("0");

        return 0;
}