1407 用两种方法对IPV6地址进行压缩的c程序实现

来源:互联网 发布:fcc 网络中立 编辑:程序博客网 时间:2024/05/20 20:44

这里写图片描述

#include<stdio.h>int main() {    int n=10,c,t,m,i,j,k;    char str[100];    void qiandao0(char str[]);    void shuangmao(char str[]);    scanf("%d",&t);    while(t--) {        scanf("%s",&str);        qiandao0(str);        //  printf("%s\n",&str);        shuangmao(str);        printf("%s\n" ,str);    }    return 0;}void qiandao0(char str[]) {    int i,j;    //qiandao0    for(i=0,j=0; str[j]!='\0'; i++,j++) {        if(str[j]=='0'                &&(j==0||str[i-1]==':')) {// the first 0            if(str[j+1]!='0') {// 0XXX                j++;            } else if(str[j+2]!='0') { //00XX                j=j+2;            } else { //000X 0000                j=j+3;            }        }        str[i]=str[j];    }    str[i]='\0';//补上结尾}void shuangmao(char str[]) {    int i,j,mao=0;    for(i=0,j=0; str[j]!='\0'; i++,j++) {        if(mao == 0 ) {            //还没传入过 ::            if(str[j]=='0'&&str[j+1]=='\0'&&j-1>=0&&str[j-1]==':') {  //情况1 X:X:0                if(i==0) { // 还没有传入第一个: 补回                    str[0]=':';                    i++;                    //补回后 开始传入第二个冒号                    str[i]=':';                    mao = 1;                    continue;                } else {                    //前面X:X: 已经传入第一个冒号                    str[i]=':';                    mao = 1;                    continue;                }            } else if(str[j]=='0'&&str[j+1]==':'&&str[j+2]!='0'&&j-1>=0&&str[j-1]==':') { //情况2  X:X:0:X                if(i==0) { // 还没有传入第一个: 补回                    str[0]=':';                    i++;                }                j=j+1;//这里不传入 留到 L91统一赋值                mao=1;            } else if(str[j]=='0'&&str[j+1]==':'&&str[j+2]=='0'&&j-1>=0 && str[j-1]==':') {//情况3  X:X:0:0....                j=j+2 ; //跳到下一个0位置 j索引值【】 从   X:X:【0】:0.... 变成  X:X:0:【0】....                i--;                j--;// to avoid 'for' condition3(i++,j++)                continue;            } else if(str[j]=='0'&&str[j+1]==':'&&str[j+2]!='0'&&j==0) { //情况4 类似情况2 在开头 0:X                if(i==0) {                    str[0]=':';                    i++;                }                j=j+1;                mao=1;            } else if(str[j]=='0'&&str[j+1]==':'&&str[j+2]=='0'&&j==0) { //情况5 类似情况3 0:0                j=j+2 ;                i--;                j--;// to avoid 'for' condition3(i++,j++)                continue;            }        }        //不管mao是多少 中间怎么变  除非是continue跳过 不然就都到这里L91来赋值        //  printf("str i :%c--%d  ",str[i],i);        //  printf("str j :%c--%d\n",str[j],j);        str[i]=str[j]; //L91 进行赋值    }    str[i]='\0';//补上结尾}
原创粉丝点击