8進数=>10進数変換関数

mixiC言語関係のコミュニティに8進数=>10進数の変換関数についてというものがあった。
まぁこれは多分charとintの変換を課題としているのだろうから以下はまったくのヲタ話である。


8進数や16進数、10進数の変換はバイナリデータを扱うと実用で使うことになるので学習用の課題になる。しかしそうであるのならsprintfやsscanfが使えることを教えてほしい。これを知らない人が多すぎる。

たとえば以下のような感じだ。

#include <stdio.h>
#include <string.h>

/* strから改行コードを削る */
void chomp(char *str)
{
    while (*str != '\n' && *str != '\0') {
        str++;
    }
    *str = '\0';
}

int main(void)
{
    char buf[1024];
    int x;
    int result;
    
    while (fgets(buf, 1024, stdin) != NULL) {
        chomp(buf);
        result = sscanf(buf, "%o", &x);
        if (result != 1) {
            fprintf(stderr, " !error!, input octal string\n");
            continue;
        }
        printf("octal(%s) is decimal(%d)\n", buf, x);
    }

    return 0;
}

sscanfのフォーマット変数%oがミソでちゃんとコンパイラが変換してくれる。もちろんエラー制御を細やかにしたい場合はscanfやprinfのフォーマットでは対応できないこともあるだろうが、printf, scanfのような使いでのある関数を知らないのはもったいない。