wchar在C中实现一个简单的Caesar密码

时间:2014-02-04 06:31:17

标签: c localization wchar

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

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,则工作正常。当键值为6或更高时,问题就出现了。到目前为止我打印了一个额外的char。我通过gdb运行它,看看它在哪里拿起额外的char。但是没有多大意义。以下是我的问题:

  1. 为什么它适用于0到5的键而不是上面的键?
  2. 它在哪里获得额外的字符,它打印的密钥大于5?
  3. 如果它有助于我的机器上的wchar大小为4byte。

    谢谢

    编辑:

    示例输入:

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

    0010显示为在unicode表上没有相应符号的那些字符。

    再次感谢。

1 个答案:

答案 0 :(得分:0)

你看到的额外字符是宽字符换行符(0x000a),它保存在你用fgetws读取的字符串的末尾,并且你移动了6个字符,导致{{ 1}}。这似乎不是一个可打印的字符,终端决定将字符代码打印为普通的十六进制数字。

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