0

10進数を16進数に変換するために書いているコードに問題があります。

void decToHex (char *decString){
    char hexVal[100];
    sprintf(hexVal,"%x", *decString);
    *decString = hexVal;
    return;
}

コンパイルエラー:警告:代入により、キャストなしで整数からポインターが作成されます(デフォルトで有効)。「*decString=hexVal;」という行について言えば ここで、ポインタ値を新しく検出された16進値に設定しようとしています。

誰かが私が間違っていることを知っていますか?これはコンパイラーの問題である可能性があると述べた他のいくつかの投稿を読みましたが、クラスでは、パテサーバーに組み込まれている標準のc99コンパイラーを使用する必要があります。これを行う方法についてのアイデアはありますか?また、モジュラス16のアイデアに基づいてintの配列を作成しようとしましたが、それに関してさらに多くの問題がありました。

4

4 に答える 4

2

*decStringcharです。hexVal(このコンテキストでは)はcharへのポインタであるため、アドレスをcharに格納しようとします。したがって、エラー。

実行してもdecString=hexVal、2つの理由で機能しません。decString関数内でのみ変更されhexVal、ローカル変数であるため、関数外では無効です。

これの代わりに、文字列fromhexValからdecString:までをコピーしますstrcpy(decString, hexVal);

于 2012-04-09T23:43:23.760 に答える
1

試した方法で C 文字列を割り当てることはできません。代わりに、次のことが必要です。

strcpy(decString, hexVal);
于 2012-04-09T23:38:23.280 に答える
0

*decString = hexVal;に問題があります。 decStringはへのポインタなcharので、を*decString表しますchar。ただし、hexValchar*(技術的には&hexVal[0])です。文字にポインタを割り当てようとしています。8ビットプラットフォームを使用していない限り、ポインタは文字内に収まりません。また、ポインタはローカル変数へのポインタです。つまり、関数が戻るとポインタは無効になります。文字列をコピーしようとしている場合は、代わりにを使用してください。strncpy()

タスクを明確にするために、10進数の文字列表現を16進数の文字列表現に変換しようとしてます?その場合、文字列を直接変換しようとするのではなく、文字列を整数に変換してから文字列に戻すと、おそらくより成功するでしょう。との組み合わせでそれを処理する必要があります。sscanf()sprintf()

于 2012-04-09T23:43:58.707 に答える
0

この行で:

*decString = hexVal;

*decStringであるcharため、ポインタを に割り当てているcharため、警告が表示されます。

C では文字列を割り当てることができません。一般に、それらをコピーする必要があります。

ただし、変換する値を指定し、フォーマットされた値に十分なスペースを確保する必要もあります。現時点では、 の最初の文字decStrを 16 進数に変換していますが、これはインターフェイスとしては少し変わっています (実際には間違っている可能性があります)。

通常は次のようにします。

void decToHex(int value, char *hexString)
{
    sprintf(hexString,"%x", value);
}

変更されたインターフェイスに注意してください。これにより、関数は十分なスペースがあることを確認できません。悲しいことに、呼び出し元のコードに負担をかけることは、長年の (しかし厄介な) C の伝統です。それを行うためのより安全な方法はsnprintf()、C99 から使用します。

int decToHex(int value, char *buffer, size_t buflen)
{
    return snprintf(buffer, buflen, "%x", value);
}

これにより、文字列の長さ、またはすべてのデータを格納するスペースがなかった場合のバッファーの長さがわかります (変換された文字列が長すぎる場合に -1 を返す Windows を除く)。文字列は null で終了する必要があり (MSVC に注意)、 および で指定されたバッファーをオーバーフローしてはなりませbufferbuflen。NULL に設定bufferすると、原則として、必要なバッファーの大きさを知ることができます (MSVC に注意してください)。

通常は次のように呼び出します。

char buffer[20];

if (decToHex(314159265, buffer, sizeof(buffer)) >= sizeof(buffer))
    ...oops - conversion failed...

または、より怠惰に:

 char buffer[32];  // Bigger margin for error

 decToHex(314159265, buffer, sizeof(buffer));
于 2012-04-10T00:02:58.827 に答える