首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这个程序的结果为何是这样的?(保证结贴给分)

2012-10-28 
这个程序的结果为什么是这样的?(保证结贴给分)题目:给定一个点分十进制的IP地址,把这个IP地址转换为二进制

这个程序的结果为什么是这样的?(保证结贴给分)
题目:给定一个点分十进制的IP地址,把这个IP地址转换为二进制形式。

输入

每个测试用例的输入只有一行,一个点分十进制的IP地址

包括四个正整数,用三个.分开,形式为a.b.c.d
其中0<=a,b,c,d<=255

输出

每个测试用例的输出只有一行,即转换为二进制形式IP地址,忽略多余的前缀0

样例输入

10.10.136.69

样例输出

1010.1010.10001000.1000101
[code=C/C++][/code]
#include <stdio.h>
void itobs(int n, char* ps);
int main()
{
int a, b, c, d, i;
char ch1, ch2, ch3;
char cha[32], chb[32], chc[32], chd[32];
  while(scanf("%d%c%d%c%d%c%d", &a, &ch1, &b, &ch2, &c,&ch3, &d) != EOF)
{
   
itobs(a, cha);
itobs(b, chb);
itobs(c, chc);
itobs(d, chd);
i = 0;
while(cha[i] == '0')
i++;

if(i<=31)
{
printf("%s.", cha+i);
}else{
printf("0.");
}

i = 0;
while(chb[i] == '0')
i++;
if(i<=31)
{
printf("%s.", chb+i);
}else{
printf("0.");
}

i = 0;
while(chc[i] == '0')
i++;
if(i<=31)
{
printf("%s.", chc+i);
}else{
printf("0.") ;
}

i = 0;
while(chd[i] == '0')
i++;
if(i<=31)
{
printf("%s\n", chd+i);
}else{
printf( "0\n");
}

}

return 0;
}
void itobs(int n, char* ps)
{
int i;
  int size = 8 * sizeof(int);

for(i=size-1; i >= 0; i--, n>>=1)
{
ps[i] = (01&n) + '0';

ps[size] = '\0';

}
[code=C/C++][/code]
这个程序,前三个字符数组无法输出
[code=C/C++][/code]
#include <stdio.h>
void itobs(int n, char* ps);
int main()
{
int a, b, c, d, i;
char ch1, ch2, ch3;
char cha[32], chb[32], chc[32], chd[32];
  while(scanf("%d%c%d%c%d%c%d", &a, &ch1, &b, &ch2, &c,&ch3, &d) != EOF)
{
   
itobs(a, cha);
i = 0;
while(cha[i] == '0')
i++;

if(i<=31)
{
printf("%s.", cha+i);
}else{
printf("0.");
}
itobs(b, chb);
i = 0;
while(chb[i] == '0')
i++;
if(i<=31)
{
printf("%s.", chb+i);
}else{
printf("0.");
}
itobs(c, chc);
i = 0;
while(chc[i] == '0')
i++;
if(i<=31)
{
printf("%s.", chc+i);
}else{
printf("0.") ;
}
itobs(d, chd);
i = 0;
while(chd[i] == '0')
i++;
if(i<=31)
{
printf("%s\n", chd+i);
}else{
printf( "0\n");
}

}

return 0;
}
void itobs(int n, char* ps)
{
int i;
  int size = 8 * sizeof(int);

for(i=size-1; i >= 0; i--, n>>=1)
{
ps[i] = (01&n) + '0';

ps[size] = '\0';

}
[code=C/C++][/code]
这样函数位置改一下就输出正确了。
在DEV和VC6.0下都是如此,在VS2010下面的话,两段程序的结果都正确。请教下大牛,为什么这样?


[解决办法]
因为最后ps[size] = '\0';应该为ps[size-1] = '\0'

第一个程序进行时,
itobs(a, cha);
itobs(b, chb); //把cha的结束符\0改掉了。
itobs(c, chc); //把chb的结束符\0改掉了。
itobs(d, chd); //把chc的结束符\0改掉了。
所以只有第四个能显示。

第二个程序虽然也改掉了前一个的结束符,但是是在打印后改的,所以没问题。

热点排行