2012-05-09 22 views
0

16進形式の倍精度浮動小数点数を表すchar配列があります。char配列のcharをANSI Cの独自のchar配列に変換する

char *hex = ""402499999999999A" 

私は、独自のchar型の配列としてhex内の各文字を抽出し、unsigned int型numにそれを読んでもらいたいです。例えば、私は

sscanf((char *)&hex[3], "%X", &num); 

を試してみました。しかし、これは私に、個々のchar型の配列として第四文字を与えるものではありません、それは私が配列がで与えられているためであると仮定している、私の上の4位からサブchar型の配列を与えます最初の要素のポインタ

これを行うより良い方法はありますか?私はstrcpyを見て、最初のn個の文字しかコピーできないようですので、それは良いことではありません。

+2

質問を洗練できますか?私はあなたが個々のchar配列とサブchar配列の意味を混乱させています。文字列はcharの配列であり、要素をインデックスするとその要素が与えられますが、その要素へのポインタを与えるアドレスを取得していることがわかります。あなたは正確に何をしたいのですか? –

+0

さて、char配列は、最初の要素への(const)ポインタで識別されます。だから(char *)&hex [3]を実行することで、char配列 'hex 'の4番目の要素のポインタを取得しています。私はこれが私に個々のchar配列としての4番目のcharを与えるだろうと考えていましたが、代わりにこれが私にサブchar配列 'hex [4 to end]'を与えました。 –

答えて

1

これはさまざまな方法で実行できます。

char only_1_char[2] = {'\0', '\0'}; 
only_1_char[0] = hex[3]; 
sscanf(only_1_char, "%X", &num); 

、より効率的なソリューション:

if (hex[3] <= '9') 
    num = hex[3] - '0'; 
else 
    num = hex[3] - 'A' + 10; 

これは単なるサンプルですけれども、一つの方法は、(あなたがそれをやっていたかの正しい方法がある)は次のようです。真実であれば、無効な入力を処理する必要があります。

+0

これは正常です。最初のメソッド、つまり 'sscanf'を使用する方法があり、一時変数' only_1_char'を使用する必要はありませんか? –

+0

'sscanf'は' NUL'で終了する文字列を必要とします。とにかく余分な変数が必要になります。他の方法の1つは、 'char temp = hex [i + 1]; hex [i + 1] = '\ 0'; – Shahbaz

+0

文字列の長さ( 'length')を知っていれば、sscanf(&hex [i]、"%X "、&num); hex [i + 1] = temp; while(0) 'とそれ以降の' '変数を使わずに行うことは非常に醜い方法です:' #define SWAP(x、y)do {x = x^y; y = x^y; SWAP(hex [i]、hex [length-1]); sscanf(&hex [length-1]、 "%X"、&num); SWAP(hex [i]、hex [length-1]);私が言ったように、これはひどい方法です(可能であることをあなたに知らせたいと思っています)。 – Shahbaz

0

はこのような何かを試してみてください:

for(i = 0; src[i] != 0; i++) { 
    if(src[i]) <= '9') { 
     dest[i] = src[i] - '0'; 
    } else { 
     dest[i] = toupper(src[i]) - 'A' + 10; 
    } 
} 

それは( "srcが[i]が" 有効/正気な文字が含まれている場合、例えば検出)エラー処理を改善することができます。