C言語ケーススタディ 16進数表記の文字列を数値に変換する




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



2進数表記の文字列を数値に変換するプログラムを改造し16進数表記の文字列を変換するようにします。
16進数表記の文字列から数値への変換もstrtol、scanf関数などで行うことができるので、実用的にはあまり意味のないプログラムです。
主な改造のポイントは次のようになります。
・関数名をbinvalからhexvalに変更
・ループ内の2を掛けている所を16に変更
・文字列の最大サイズを8桁に変更
・文字から数値への変換で0から9とaからf(AからF)の場合を分けて処理するように変更
unsigned int
        hexval(char *str);

main(int argc, char *argv[])
{
        if(argc != 2){
                printf("コマンドの入力形式が間違っています.\n");
                return;
        }
        printf("%x\n", hexval(argv[1]));
}


unsigned int
        hexval(char *str)
{
        unsigned long
                num;
        int     i1, ch;

        num = 0L;
        for(i1 = 0; ; i1++){
                if(str[i1] >= '0' && str[i1] <= '9'){
                        ch = str[i1] - '0';
                }
                else if(str[i1] >= 'a' && str[i1] <= 'f'){
                        ch = str[i1] - 'a' + 10;
                }
                else if(str[i1] >= 'A' && str[i1] <= 'F'){
                        ch = str[i1] - 'A' + 10;
                }
                else if(str[i1] == '\0'){
                        break;
                }
                else{
                        printf("変換エラー\n");
                        num = 0xFFFFFFFF;
                        break;
                }
                num *= 16;
                num += ch;
                if(i1 >= 8){
                        printf("値がオーバーしました\n");
                        num = 0xFFFFFFFF;
                        break;
                }
        }
        return(num);
}
Study Cにロードする Study Cにロードし編集する ブラウザとの連携機能が使用可能なStudy Cのバージョンなどについて... 「run 12ab」のように実行する必要があるので実行ボタンはありません


[an error occurred while processing this directive]