c言語 IPv6 省略

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
please

c言語 IPv6 省略

#1

投稿記事 by please » 7年前

IPv6アドレス
標準入力から入力されるIPv6アドレスを、省略表記を準拠して省略した内容を標準出力に表示するプログラムを作成しなさい。
IPv6の表記法、省略表記ルールに関しては、各自で調べること。
IPv6の表記法に違反するものに関してはerrorと表示すること。
半角英数字と:以外は入力されないものとし、考慮不要とする。

標準入力
fe80:0000:0000:0000:0250:56ff:fec0:0008
出力結果
fe80::250:56ff:fec0:8

かずま

Re: c言語 IPv6 省略

#2

投稿記事 by かずま » 7年前

連続する 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;
}
面白い問題です。質問の仕方がちゃんと
していれば、すぐに回答したんですがねえ。

返信

“C言語何でも質問掲示板” へ戻る