こんにちは。
16進数の文字列を数値に変換するルーチンを調査したところ、以下のサイトを発見することができました。
http://www.cisnet.or.jp/home/tsuneoka/win32sub/a …
ただし、このサイトのルーチンはDOS用に作成されているため、int = 16bit が前提になっており、変換するとき、0x7fffffff より大きい値(0xfffffffe)は変換できません。
このサイトのルーチンを改造して、変換可能な最大値を符号なし32bit(0xffffffff)にするには、どうしたらよいのでしょうか?
No.1ベストアンサー
- 回答日時:
標準関数の
stdlib.h
strtoul
を使いましょう。(何か理由があれば別ですが)
サンプル
#include <stdio.h>
#include <stdlib.h>
void main(void){
unsigned long x;
char *HEXSTR="FFFFFFFF";
char *endp;
x=strtoul(HEXSTR, &endp,16);
printf("%X\n",x);
x=strtoul("0xF0F0F0F0", &endp,16);
printf("%X\n",x);
}
No.3
- 回答日時:
#2の方の回答に補足します。
まず、nptrやbaseがいきなり出てきていますが、
unsigned long strtoul(const char *nptr, char **endptr, int base);
ということですね。
以下、これに乗っかって説明します。
エラーの検出方法ですが、文字列全体が変換対象になったかどうかを調べるには、**endptr が '\0' であることを調べれば可能です。また、オーバーフローについては errno の値を調べれば分かります(事前に errno を 0 にしておくことをお忘れなく)。
No.2
- 回答日時:
基本的に問題なければ#1の人のstrtoul関数を使うべきでしょう。
ただし、(以下ヘルプ抜粋)
strtoul 関数は、nptr が以下の形式の文字列を指すものと想定しています。
[whitespace] [{+ | -}] [0 [{ x | X }]] [digits]
whitespace とはスペースかタブのことで、これらは無視されます。digits は 1 つ以上の 10 進数字です。この形式に一致しない最初の文字で走査は停止します。base は、2 から 36 の間の数値であると、基数として使われます。base が 0 であると、nptr が指す文字列の先頭の文字で基数を判定します。最初の文字が 0 で、2 番目の文字が 'x' または 'X' 以外であると、文字列は 8 進整数と解釈されます。それ以外の場合は、10 進数と解釈されます。最初の文字が '0' で、2 番目の文字が 'x' または 'X' であると、文字列は 16 進整数と解釈されます。最初の文字が '1' から '9' までの数値であると、文字列は 10 進整数と解釈されます。'a' から 'z' (または 'A' から 'Z') までの文字は、10 から 35 までの値に割り当てます。数値として使える文字は base よりも小さい値が割り当てられている文字だけです。
ということですので、適当な文字を入力しても変換されちまうようなので、厳密にエラーを返したい場合は入力文字列のチェックが必要かと。
あとはオーバーフロー、アンダーフロー時の処理。
そして、エラーコードが戻り値で渡せなくなるので、他の方法を考えないといけませんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- その他(Microsoft Office) エクセル 日付を数値に変換する方法 4 2023/03/24 12:05
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- その他(プログラミング・Web制作) test([)コマンドによる条件判定 2 2022/08/10 12:28
- Ruby power BI クエリエディター 〇〇を含む文字列置換 1 2022/10/16 17:34
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
反転した数値を表示させるやり方
-
sscanfとscanfの違いがよくわか...
-
C言語 空白の行(改行のみ)が...
-
CStringのFindで文字列検索を行...
-
fgets関数を使用したときの文字...
-
ファイルを読み込みテキストフ...
-
if文の判定条件('||'と'&&'の使...
-
全角文字のチェック
-
文字列中に含まれる文字の個数...
-
C言語のisdigit関数を使った問...
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
Cで「大文字、小文字の判定」は...
-
atoiでの文字列以外のエラー処...
-
CStringについて
-
C言語のステップ数をカウントす...
-
文字列の途中に「0」がある場...
-
itoaわかりません
-
1行の文字列を時間差で表示する...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
C言語のステップ数をカウントす...
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
ある文字列で2回目3回目に出現...
-
itoaわかりません
-
fgets関数を使用したときの文字...
-
fgetsで拾われる改行文字を削除...
-
C言語で16進数文字列から16進数...
-
CStringについて
-
文字列中に含まれる文字の個数...
-
strstrを利用しない文字列検索...
-
文の意味
-
エディットボックスに入力され...
-
文字列の途中に「0」がある場...
-
C++
-
putsとputcharの違い?
-
教えていただけませんか?C言語...
おすすめ情報