注册 登录
编程论坛 C语言论坛

IP地址转换

裂地劈龙 发布于 2019-12-12 20:07, 2886 次点击
一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。

输入格式:
输入在一行中给出32位二进制字符串。

输出格式:
在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。

输入样例:
11001100100101000001010101110010
输出样例:
204.148.21.114


看下我这个有啥问题
#include <stdio.h>
#include <math.h>
int main()
{
  int a[4][8],i,j,c[4];
  for(i=0;i<4;i++)
  {
   for(j=0;j<8;j++)
   scanf("%d",&a[i][j]);
  }
  for(i=3;i>=0;i--)
  {
    for(j=7;j>=0;j--)
    c[i]=(a[i][j]-'0')*(int)pow(2,7-j);
  }
    for(i=0;i<3;i++)
      printf("%d.",c[i]);
      printf("%d",c[3]);
}
6 回复
#2
rjsp2019-12-12 20:22
a[i][j]-'0' 这时干啥的?
#3
纯蓝之刃2019-12-12 20:35
程序代码:
#include <stdio.h>
#include <string.h>

int main()
{
    int i,j,c[4]={0};
    char ch[33]={0},a[4][8];

    scanf("%s",ch);

    for(i=0;i<4;i++)
    {
        memcpy(a[i],&ch[i*8],8);
        for(j=7;j>=0;j--)
            c[i]|=(a[i][j]-'0')<<(7-j);
    }

    for(i=0;i<3;i++)
        printf("%d.",c[i]);
    printf("%d",c[3]);

    return 0;
}
#4
rjsp2019-12-12 20:40
我也写一段,仅供参考

程序代码:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main( void )
{
    char s[33];
    scanf( "%s", s );

    uint32_t ip = 0;
    for( const char* p=s; *p; ++p )
        ip = ip*2 + *p-'0';
    printf( "%"PRIu32".%"PRIu32".%"PRIu32".%"PRIu32"\n", (ip>>24)&0xFF, (ip>>16)&0xFF, (ip>>8)&0xFF, (ip>>0)&0xFF );
}

#5
吹水佬2019-12-12 23:03
#include <stdio.h>

typedef union _IP
{
    unsigned char c[4];
    unsigned int u;
} IP;

int main()
{
    char s[33];
    int n;
    scanf("%32s%n",s,&n);
    IP ip={0};
    int i;
    for(i=0; i<n; ++i)
        if (s[i]=='1')
            ip.u += 1<<(n-1-i);
    printf("%u.%u.%u.%u",ip.c[3],ip.c[2],ip.c[1],ip.c[0]);
}
#6
forever742019-12-13 10:31
程序代码:

#include <stdio.h>
int main()
{
  int i;
  unsigned char ch;
  for(i=0;i<32;i++)
  {
    ch=(ch<<1)+(getchar()-'0');
    if(i%8==7)printf("%u%c",ch,i<31?'.':'\n');
  }
}
#7
bcbbcclbbc2019-12-13 10:43
回复 楼主 裂地劈龙
#include <stdio.h>
#include <math.h>
int main()
{
  int a[4][8],i,j;
  int c[4]={0};
  
  for(i=0;i<4;i++)           //给数组赋值,题目:输入在一行中给出32位二进制字符串
  {                          //%d格式符只能让计算机识别一个整数,而无法将32位数给你分成4*8等份
   for(j=0;j<8;j++)          //所以要么定义为字符数组,要么改成%1d限制每次只读取一位数
   scanf("%1d",&a[i][j]);
  }
  //for(int i=0;i<4;i++){ for(int j=0;j<8;j++) printf("%d",a[i][j]); printf(" ");}printf("\n");
  //输出数组
  for(i=3;i>=0;i--)          //这里二进制转十进制,方法就是从右开始每位上的数乘以相应位上的权
  {                          //这个循环中你只计算了每一位的转化,却没有相加,就等于费劲。
    for(j=7;j>=0;j--)
    c[i]+=a[i][j]*(int)pow(2,7-j);          //需对数组初始化
  }
  
    for(i=0;i<3;i++)          //至于输出,没什么问题。如果简洁一点的话可以转化了一个二进制就输出,
      printf("%d.",c[i]);     //不需要定义一个数组,赋值完再输出。
      printf("%d",c[3]);
}

希望有所收获
1