0

エチオピアで広く話されている言語の 1 つであるアムハラ語の簡単なシーザー実装を作成しています。ここにコードがあります

main(){
         setlocale(LC_ALL, " ");
         int i, key=0;
         wchar_t message[20];
         wprintf(L"Enter message:>");
         fgetws(message, sizeof(message), stdin);
         wprintf(L"Enter cipher key:>");
         wscanf(L"%d", &key);
         /* basic input validation goes here */
         for(i=0;message[i]!='\0'; i++){
                 message[i]=message[i]+key;
          }
       wprintf(L"The cipher is: %ls", message);
       wprintf(L"\n");
  return 0;
   }

コードは警告なしでコンパイルされます。キーが 5 以下の場合は問題なく動作します。キーの値が 6 以上の場合に問題が発生します。私がテストした限り、追加の文字が1つ出力されます。gdb を実行して、追加の文字がどこで取得されているかを確認しました。しかし、あまり意味がありませんでした。ここに私の質問があります:

  1. 0 から 5 のキーでは機能するのに、それより上では機能しないのはなぜですか?
  2. 5 より大きいキーに対して出力する追加の文字はどこで取得しますか?

それが役立つ場合、私のマシンの wchar のサイズは 4 バイトです。

ありがとうございました

編集:

サンプル入力:

                message: ተደለ
                key: 6 
                output: ቶዶሎ 0010
                output I expect ቶዶሎ  

0010 は、Unicode テーブルに対応する記号がない文字のように表示されます。

再度、感謝します。

4

1 に答える 1

0

0x000a表示される余分な文字は、読み取り文字列の最後に保持されるワイド文字の改行 ( ) でありfgetws、6 文字シフトすると、0x0010. これは印刷可能な文字ではないようで、端末は文字コードをプレーンな 16 進数として印刷することを決定します。

シフトする前に末尾の改行を削除するか、印刷可能な文字のみをシフトします。

于 2014-02-04T09:54:07.643 に答える