IPv6アドレス
標準入力から入力されるIPv6アドレスを、省略表記を準拠して省略した内容を標準出力に表示するプログラムを作成しなさい。
IPv6の表記法、省略表記ルールに関しては、各自で調べること。
IPv6の表記法に違反するものに関してはerrorと表示すること。
半角英数字と:以外は入力されないものとし、考慮不要とする。
例
標準入力
fe80:0000:0000:0000:0250:56ff:fec0:0008
出力結果
fe80::250:56ff:fec0:8
c言語 IPv6 省略
Re: c言語 IPv6 省略
連続する 0 で最左最長のものを :: に置き換える、
ということでしょうか。
面白い問題です。質問の仕方がちゃんと
していれば、すぐに回答したんですがねえ。
ということでしょうか。
#include <stdio.h>
void print(const int *x)
{
int i, j = -1, k = 0, m = 0, n, c = 0;
for (i = 0; i < 8; i++)
if (x[i]) k = 0;
else if (++k > m) m = k, j = i;
n = j - m;
for (i = 0; i <= n; i++) c = printf(c ? ":%x" : "%x", x[i]);
if (m > 1) printf("::"), c = 0;
while (++j < 8) c = printf(c ? ":%x" : "%x", x[j]);
putchar('\n');
}
int main(void)
{
char s[100]; int x[8];
while (printf(">> "), scanf("%99s", s) == 1) {
//puts(s);
if (sscanf(s, "%4x:%4x:%4x:%4x:%4x:%4x:%4x:%4x",
x, x+1, x+2, x+3, x+4, x+5, x+6, x+7) == 8) print(x);
else puts("error");
}
return 0;
}
していれば、すぐに回答したんですがねえ。