题目:大意是在说给定一个ipv6地址的简记形式,让你给它补全输出。
简记的规则大致是把地址中的一部分0去掉,其中还包括一连串的0,此时可用::来代替。
方法:首先记录给定的字符串中的:的个数,让后就能确定::中间要补全的0000的个数,然后对于每个小地址(例如bfd),补全失去的0就好了,这时候可以使用printf输出补0的功能,即:printf("%04s",s);
注意:本来每个字符串中:的个数是不能超过7个的,但是会出现::连用,就可能出现8个,这样对于计算::之间补全0000的个数计算就会造成困难,所以要单独处理。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
char s[100];
char t[5];
memset(t,0,sizeof(t));
cin>>s;
int len=strlen(s),k=0 ;
int ans=0,tt=0;
for(int i=0; i<len; i++)
if(s[i]==':') ans++;
ans=7-ans;
if(ans<0)
for(int i=0; i<len; i++)
{
if(s[i]==':'&&s[i+1]==':')
{
for(int j=i+1; j<len; j++)
s[j]=s[j+1];
len--;
break;
}
}
for(int i=0; i<len; i++)
{
if(s[i]==':')
{
printf("%04s",t);
k++;
if(k<8) cout<<":";
if(s[i+1]==':')
for(int j=1; j<=ans; j++)
{
printf("0000");
k++;
if(k<8) cout<<":";
}
memset(t,0,sizeof(t));
tt=0;
}
else
t[tt++]=s[i];
}
printf("%04s",t);
cout<<endl;
}
return 0;
}