C は整数と文字の間の変換をどのように処理しますか? 整数変数を宣言し、ユーザーに数値を尋ねたが、代わりに文字列を入力したとします。何が起こるでしょうか?
5 に答える
ユーザー入力は文字列として扱われ、atoi または別の変換関数を使用して int に変換する必要があります。Atoi は、文字またはその他の数値以外の文字が含まれているために文字列を数値として解釈できない場合、0 を返します。
MSDN の atoi ドキュメントでもう少し読むことができます - http://msdn.microsoft.com/en-us/library/yd5xkb5c(VS.80).aspx
他の人が指摘しているように、データは通常、文字列として入力されます。唯一の問題は、読み取りを行うためにどの関数が使用されるかです。GUI を使用している場合、関数は既に整数への変換やエラーの報告などを適切に処理している可能性があります。標準 C を使用している場合は、通常、値を文字列に読み込んでから変換する方が簡単です (おそらく使用しfgets()
てから変換します。atoi()
使用することはできますが、これが最良の選択になることはめったにありません。問題は、変換が成功したかどうか (および生成された) を判断することです)。ユーザーがゼロの正当な表現を入力したため、ゼロ) またはそうではありません。
一般に、strtol()
またはその親戚の 1 つ ( strtoul()
、strtoll()
、strtoull()
) を使用します。浮動小数点数を変換するには、strtod()
または同様の関数を使用します。整数変換ルーチンの利点は次のとおりです。
- オプションの基数の選択 (たとえば、基数 10、基数 10 - 16 進数、基数 8 - 8 進数、または標準 C 規則 (8 進数の場合は 007、16 進数の場合は 0x07、10 進数の場合は 7) を使用した上記のいずれか)。
- オプションのエラー検出 (変換が停止した場所を知ることによる)。
これらの関数仕様の多くについて (実際の C 標準のコピーを見ない場合)、私が行く場所はPOSIX Web サイト (C99 関数を含む) です。Windows 中心ではなく、Unix 中心です。
注意すべきもう 1 つのことは、C では、文字と整数はある程度「互換性がある」ということです。int には任意の文字を割り当てることができます。逆も機能しますが、整数値が char に収まらない場合は情報が失われます。
char foo = 'a'; // The ascii value representation for lower-case 'a' is 97
int bar = foo; // bar now contains the value 97
bar = 255; // 255 is 0x000000ff in hexadecimal
foo = bar; // foo now contains -1 (0xff)
unsigned char foo2 = foo; // foo now contains 255 (0xff)
え?常に文字列を入力します。次に、さまざまなエラー (オーバーフロー、不正な文字など) を処理するさまざまな方法 (再度尋ねる、デフォルト値を取得するなど) を使用して、この文字列を解析して数値に変換します。
プログラムがクラッシュする可能性があるため、atoi 関数を呼び出す必要があります。