gpt4 book ai didi

c - 读取和打印宽字符串

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:11 35 4
gpt4 key购买 nike

我想在 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复制粘贴,但是没有用。我将 MINGW 与 GCC 编译器版本 6.3.0 一起使用。我也在我的 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;
}

我找到了 this table当我输入 'è' 时,我得到 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]));
}

您可能还想定义缓冲区大小,并适本地分配和释放内存。

关于c - 读取和打印宽字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53009252/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com