0

我正在为阿姆哈拉语(埃塞俄比亚广泛使用的语言之一)编写一个简单的 Caesar 实现。这是代码

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;
   }

代码在没有警告的情况下编译。如果 key 小于或等于 5,则工作正常。当 key value 为 6 及以上时,问题就出现了。就我测试而言,它会打印一个额外的字符。我通过 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. 这似乎不是一个可打印的字符,终端决定将字符代码打印为普通的十六进制数字。

在移动或仅移动可打印字符之前删除尾随换行符。

于 2014-02-04T09:54:07.643 回答