#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';//補上結尾
}
1407 用兩種方法對IPV6地址進行壓縮的c程序實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.