質問
私の友人は、文字を読むと予期しない動作が発生する状況を示しました。文字「¤」を読み取ると、プログラムがクラッシュしました。 「¤」は10進164であるため、ASCIIの範囲を超えていると結論付けることができました。
「¤」の動作に気付きましたが、> 127の文字は問題を示しているようです。問題は、そのような文字をどのように文字ごとに確実に読み取るかです。
int main(int argc, const char *argv[])
{
char input;
do
{
cin >> input;
cout << input;
cout << " " << setbase(10) << (int)input;
cout << " 0x" << setbase(16) << (int)input;
cout << endl;
} while(input);
return 0;
}
masse@libre:temp/2009-11-30 $ ./a.out
¤
 -62 0xffffffc2
¤ -92 0xffffffa4
解決
システムはUTF-8文字エンコードを使用しているため(必要な場合)、文字「&#164;」プログラムはバイトシーケンス C2 A4
を読み取ります。 char
は1バイトなので、一度に1バイトずつ読み取ります。 wchar_t
および対応する wcin
および wcout
ストリームを調べて、マルチバイト文字を読み取りますが、サポートしているエンコーディングやその方法はわかりませんロケールで遊ぶ。
また、プログラムは無効なUTF-8を出力しているため、これら2つの文字は実際には表示されません&#8212;システムに疑問符が表示されます。
(これはちょっとしたトピックであり、ややオフトピックですが、 while(input)
は while(cin)
でなければなりません。そうしないと無限ループになります。
他のヒント
コードを見ずに友人のプログラムがクラッシュする理由を説明することは困難ですが、charを配列のインデックスとして使用している可能性があります。通常のASCII範囲外の文字は符号付き文字の制限をオーバーフローするため、文字は負の値になります。
代わりに「入力」を符号なし文字として宣言します
所属していません StackOverflow