[英]Reading and Printing Wide Character String
嗨,我想閱讀並打印c中寬字符的大寫版本。 這是我的代碼:
#include <stdio.h>
#include <wctype.h>
#include <wchar.h>
#include <locale.h>
int main(){
wchar_t sentence[100];
setlocale(LC_ALL, "");
void Edit(wchar_t str[]);
printf("Enter sentence -> ");
wscanf(L"%[^\n]ls", sentence);
Edit(sentence);
getchar();
return 0;
}
void Edit(wchar_t str[]){
int i = -1;
while(str[++i])
if(iswalpha(str[i])) //get rid of whitespaces and other characters
putwchar(towupper(str[i]));
}
如果我像這樣初始化字符串,實際上問題似乎出在wscanf上:
wchar_t sentence[] = L"è";
而無需閱讀或要求輸入字符串即可對其進行編輯,則可以正常工作。
我正在使用Windows 10和美國國際鍵盤輸入,因此要使它成為“è”,必須按`+ e。 但是我也嘗試用ctrl + v復制和粘貼它,但是不起作用。 我在GCC編譯器版本6.3.0中使用MINGW。 我也在我的Macbook上嘗試了此操作,但不起作用。
問題是,如果我輸入“kèy”,我希望將“KÈY”作為輸出。 相反,我得到“ KSY”。 我不知道為什么“è”輸出“ S”,但是我嘗試了其他人聲,但得到了相同的隨機字符。 但是,如果將字符串初始化為“kèy”,則會得到“KÈY”。
更新資料
我將wscanf編輯為:
wscanf(L"%ls", sentence);
它適用於我的Macbook,但不適用於Windows! 同樣,我也不能輸入空格,因為wscanf在第一個空格處停止。
更新2
我發現了一些非常有趣的東西:使用以下代碼段:
int main(){
setlocale(LC_ALL, "");
wchar_t frase[100];
fwide(stdin, 1);
wscanf(L"%ls", frase);
wprintf(L"%ls", frase);
return 0;
}
我找到了該表 ,當我輸入'è'時得到S,這就是Win列所描述的。 所以我嘗試輸入Þ,我得到了'è'! 我認為問題出在cmd的代碼上,我正在使用頁面代碼:850
我找到了一個使用system("chcp 1252")
更改字符集的解決方案 ,它可以正常工作!
不要使用wscanf
使用fgetws
這將允許您讀取空白並防止緩沖區溢出。 通常,它的最佳做法(尤其是在使用用戶提供的輸入時)可以防止緩沖區溢出。 我在下面編輯了您的代碼。
int main(){
wchar_t sentence[100];
setlocale(LC_ALL, "");
void Edit(wchar_t str[]);
printf("Enter sentence -> ");
fgetws(sentence,100,stdin);
Edit(sentence);
getchar();
return 0;
}
void Edit(wchar_t str[]){
int i = -1;
while(str[++i])
if(iswalpha(str[i])) //get rid of whitespaces and other characters
putwchar(towupper(str[i]));
}
您可能還需要定義緩沖區大小,並正確分配和釋放內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.