1407 用兩種方法對IPV6地址進行壓縮的c程序實現

這裏寫圖片描述

#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';//補上結尾
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章