ip地址(noj1020)//gets函数在scanf函数后容易出现的错误

本文介绍了一种将32位比特流转换为标准IPv4地址的方法。通过逐段解析二进制序列并将其转换为十进制数值,最终形成由'.'分隔的四段式IP地址。文章提供了完整的C语言实现代码,包括输入处理、转换逻辑及输出格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述
想象一下你正在从输入设备上读入比特流,它表示的是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]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值