使用%2在C中使用十进制到二进制

问题描述 投票:0回答:3
#include "stdafx.h"
int main()
{
   int num = 11, i = 10;
   char s[10];
   while (num != 0)
   {
      if (num % 2 == 0)
      {
         num = num / 2;
         s[i - 1] = 0;
         i = i - 1;
      }
      if (num % 2 == 1)
      {
         num = (num - 1) / 2;
         s[i - 1] = 1;
         i = i - 1;
      }
      return s[10];
   }
   printf("\n %s", s[10]);
   getchar();
   return 0;
}

嗨,我是C代码的新手,所以也许我忽略了一些非常简单的东西,但是当我运行这段代码时,它并没有显示任何输出。而且我相信还有更多的错误本来可以简化。

c visual-c++
3个回答
0
投票
#include <stdio.h>

int main()
{
    int num = 11, i = 0, j = 0;
    char s[33];
    char be_s[33];

    do
    {
        s[i] = num % 2 ? '1' : '0';
        num = num / 2;
        i++;
    } while (num != 0);

    s[i] = '\0';

    printf("Little endian number: %s\n",s);

    for(j = 0 ; j < i ; j++)
    {
        be_s[j] = s[(i - 1) - j];
    }

    be_s[j] = '\0';
    printf("Big endian number: %s\n",be_s);
    return 0;
}

有人已经解释过你有多个问题:

  1. s的大小:你要转换的数字有多大? Int(通常)是32位,所以你需要32个字符来写它。你还需要一个特殊的字符来结束字符串'\ 0',所以33个元素的char数组应该适合这个练习
  2. Endianness:正如您可能已经注意到的那样,您希望用左侧更重要的位来表达它。问题是你无法知道前1的位置。一个选项是在评估数字后恢复位顺序
  3. 在一段时间内返回:while不是一个函数,如果你“返回”你正在退出main函数,从而关闭程序
  4. s [3]:这不是字符串,是字符串的第4个值。如果你想指向字符串开头的指针你可以使用s,或者如果你想从元素n开始读取字符串,你可以使用&s[n - 1](&=内存地址,字符串s的n元素;请注意数组启动来自元素0)
  5. char值为0和1:正如其他所说char 0char '0'不同,第一个是ascii表中的元素0,第二个是在ascii表中表示零的元素

还有很多话要说,如果你不明白我的例子就问


0
投票

您的代码有一些问题。

  • while循环中的指令只执行一次,然后程序退出,因为你在循环结束时调用return s[10]。从main返回有效退出该计划。
  • %s printf令牌需要一个字符串,其中c只是一个char的数组(char *或char []),但你传递一个char(s [10])。如果你想打印s只需使用printf("%s\n", s);
  • 更确切地说,长度为N的正确c字符串是N个字符的序列(即数组),后跟字符串结尾字符'\ 0'。因此,如果您想要“手动”构建大小为10的字符串,则首先要定义一个大小合适的数组char s[11]。然后设置s[10] = '\0';并使用0-9索引来修改构成字符串的所有其他字符。
  • 你需要在你的char中放置字符('1''0')而不是整数(不是10)。

0
投票
if (num % 2 == 0)
{
    num = num / 2;
    s[i - 1] = 0;
    i = i - 1;
}
if (num % 2 == 1)
{
    num = (num - 1) / 2;
    s[i - 1] = 1;
    i = i - 1;
}

除了在这些语句之后返回(导致程序立即退出),在这里你要么将s的字符设置为'\ 0'或'\ 1'。它们都不可打印;此外,'\ 0'表示字符串结束。将文字01改为适当的'0''1'

此外,您需要将一个零字符('\0')放入s以终止字符串,并增加s的大小以适应该额外字符。最简单的方法是从开始将s初始化为全零:char s[11] = {'\0'};

并从循环体中删除return s[10];

© www.soinside.com 2019 - 2024. All rights reserved.