合計 昨日 今日

c言語 IPv6 省略

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: please
[URL]
Date: 2017年11月28日(火) 13:19
No: 1
(OFFLINE)

 c言語 IPv6 省略

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

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

Name: かずま
[URL]
Date: 2017年12月06日(水) 10:51
No: 2
(OFFLINE)

 Re: c言語 IPv6 省略

連続する 0 で最左最長のものを :: に置き換える、
ということでしょうか。
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#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;
}

面白い問題です。質問の仕方がちゃんと
していれば、すぐに回答したんですがねえ。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[7人]