この行で:
*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 に注意)、 および で指定されたバッファーをオーバーフローしてはなりませbuffer
んbuflen
。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));