描述
想象一下你正在从输入设备上读入比特流,它表示的是IP地址,你现在的任务是把一个32位长的由’1’和’0’构成的序列转换成一个由’.’分隔成4段的IP地址。即每8位转换成一个十进制数,总共4段,由’.’分隔
输入
输入数据的第一行是一个正整数n(1<=n<=9),表示总共有n行数据需要你转换。接下来的n行里,每行都是一个32位的由’1’和’0’组成的串。
输出
输出数据是n行,每行是一个由’.’分隔成4段的IP地址。
输入样例
4
00000000000000000000000000000000
00000011100000001111111111111111
11001011100001001110010110000000
01010000000100000000000000000001
输出样例
0.0.0.0
3.128.255.255
203.132.229.128
80.16.0.1
gets函数从stdio流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。
如果在调用scanf函数读入变量n后直接用gets函数读入字符串很可能会出现gets只读入了一个n后面的换行符的情况。
gets函数接收了scanf输入完后的回车符,解决的办法是在scanf和gets中间,用getchar函数接收掉回车符,这样就不会出现任何问题。
#include<stdio.h>
#include<math.h>
char ip[33];
int result[4];
void turn();
void print();
int main()
{
int n,i;
scanf("%d",&n);
getchar();
for(i=1;i<=n;i++)
{
gets(ip);
turn();
print();
}
}
void turn()
{
int i,j,k;
for(i=0;i<4;i++)
{
result[i]=0;
k=0;
for(j=(i+1)*8-1;j>=i*8;j--)
{
result[i]=result[i]+(ip[j]-'0')*pow(2,k++);
}
}
}
void print()
{
int i;
for(i=0;i<3;i++)
{
printf("%d.",result[i]);
}
printf("%d\n",result[i]);
}