代码之家  ›  专栏  ›  技术社区  ›  Josh Curren

显示正方形而不是字符串的C程序

  •  1
  • Josh Curren  · 技术社区  · 16 年前

    我已经用Java做了很多,但我目前正在努力学习C。我正在尝试制作一个程序,把一个数字从十进制转换成二进制。

    以下是我的资料:

    #include <stdio.h>
    #define LENGTH 33
    
    int main( int argc, char*argv[ ] )
    
    {
     unsigned int number, base, remainder, x, i;
     char result[LENGTH];
    
     puts( "Enter a decimal value, and a desired base: " );
     scanf( " %u", &number );
     scanf( " %u", &base );
    
     x = number;
    
     for( i=0; i < LENGTH; i++ )
     {
      remainder = x % base;
      x = x/base;
      result[i] = remainder;
     }
    
     printf( "%u equals  %s  (base-%u) \n", number, result, base );    
    
     //***result is probably backwards...
    
    
     return 0;
    
    
    
    }
    

    下面是我运行它时得到的:

    Enter a decimal value, and a desired base: 
    5 2
    5 equals    (base-2) 
    

    正方形是什么?如何让它显示为字符串(字符数组)?

    4 回复  |  直到 12 年前
        1
  •  4
  •   Khaled Alshaya    16 年前

    最后编辑: 您的程序可能如下所示:

     unsigned int number, base, remainder, x, i;
     char result[LENGTH+1] = {0};
    
     puts( "Enter a decimal value, and a desired base: " );
     scanf( " %u", &number );
     scanf( " %u", &base );
    
     x = number;
    
     for( i=0; i < LENGTH; i++ )
    
     {
      // if base > 10, use alphabet!
      result[i] = remainder > 9 ? (remainder-10) + 'A' : remainder + '0';
      x = x/base;
      result[i] = remainder + '0';
     }
    

    首先,在编写余数时,应该添加数字的ASCII偏移量。

      result[i] = remainder + '0';
    

    另外,你忘了添加 '\0' 最后。

     result[i] = 0;
     printf( "%u equals  %s  (base-%u) \n", number, result, base );
    

    编辑: 当写入C字符串时,我通常将字符串初始化为零:

    char result[LENGTH] = {0};
    

    这样你就不需要写 null character 最后,它是为你写的。


    感谢@mmyers指出溢出:) 我会声明要保留的字符串 LENGTH+1 以下内容:

    char result[LENGTH+1] = {0};
    
        2
  •  4
  •   Pillsy    16 年前

    要将数字作为字符存储在 result[i] 而不是实际的余数。实现这一点的一种方法是索引到一个具有所需数字的辅助数组(可以是字符串文字)。

    char digits[] = "0123456789ABCDEF";
    
    /* stuff */
    
    result[i] = digits[remainder];
    
    /* more stuff */
    

    另外,告诉您空终止字符串的其他注释是完全正确的。

    编辑:无论走哪条路线,都应确保输入的值 base 大于0且不大于要处理的最大值。

        3
  •  1
  •   James Black    16 年前

    您需要确保字符串的值介于32和127之间,以便在终端上显示。

    for( i=0; i < LENGTH; i++ )
    
     {
      remainder = x % base;
      x = x/base;
      result[i] = remainder;
     }
    

    在本节中,您将向数组中放入较小的值,因此它不会显示为ASCII字母。

    你可能只想拥有这样的东西: 结果[i]=余数+'0';

    一种简单的方法是打印出字符串每个部分的ASCII值,然后查看该值是什么。

        4
  •  0
  •   Clifford    16 年前

    这是一个学术练习吗?如果没有很多C编译器库包括 itoa() 完全满足您需要的功能。它不是由ISO标准C库定义的,但通常包含在大多数编译器中。