簡體   English   中英

讀取和打印寬字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM