我正在为阿姆哈拉语写一个简单的凯撒实现 - 这是埃塞俄比亚广泛使用的语言之一。这是代码
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。但是没有多大意义。以下是我的问题:
如果它有助于我的机器上的wchar大小为4byte。
谢谢
编辑:
示例输入:
message: ተደለ
key: 6
output: ቶዶሎ 0010
output I expect ቶዶሎ
0010显示为在unicode表上没有相应符号的那些字符。
再次感谢。
答案 0 :(得分:0)
你看到的额外字符是宽字符换行符(0x000a
),它保存在你用fgetws
读取的字符串的末尾,并且你移动了6个字符,导致{{ 1}}。这似乎不是一个可打印的字符,终端决定将字符代码打印为普通的十六进制数字。
在移动或仅移动可打印字符之前删除尾随换行符。