gpt4 book ai didi

c++ - 如何读取 C++ 中的重音字符并将它们与 isalnum 一起使用?

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:37 25 4
gpt4 key购买 nike

我正在用法语编程,因此,我需要使用重音字符。我可以使用输出它们 #include <locale>setlocale(LC_ALL, "") , 但是当我读重音字符时似乎有问题。这是我用来说明问题的简单示例:

#include <locale>
#include <iostream>

using namespace std;

const string SymbolsAllowed = "+-*/%";

int main()
{
setlocale(LC_ALL, ""); // makes accents printable

// Traduction : Please write a string with accented characters
// 'é' is shown correctly :
cout << "Veuillez écrire du texte accentué : ";

string accentedString;
getline(cin, accentedString);

// Accented char are not shown correctly :
cout << "Accented string written : " << accentedString << endl;

for (unsigned int i = 0; i < accentedString.length(); ++i)
{
char currentChar = accentedString.at(i);

// The program crashes while testing if currentChar is alphanumeric.
// (error image below) :
if (!isalnum(currentChar) && !strchr(SymbolsAllowed.c_str(), currentChar))
{
cout << endl << "Character not allowed : " << currentChar << endl;
system("pause");
return 1;
}
}

cout << endl << "No unauthorized characters were written." << endl;

system("pause");
return 0;
}

这是程序崩溃前的输出示例:

Veuillez écrire du texte accentué : éèàìù
Accented string written : ʾS.?—

我注意到 Visual Studio 的调试器显示我编写的内容与它输出的内容不同:

[0] -126 '‚'    char
[1] -118 'Š' char
[2] -123 '…' char
[3] -115 '' char
[4] -105 '—' char

显示的错误似乎表明只能使用 -1 到 255 之间的字符,但是根据 ASCII table我在上面示例中使用的重音字符的值不要超过此限制

这是弹出的错误对话框的图片:Error message: Expression: c >= -1 && c <= 255

有人可以告诉我我做错了什么或给我一个解决方案吗?先感谢您。 :)

最佳答案

  1. char在你的系统上是一个带符号的类型(事实上,在许多系统上)所以它的值范围是 -128 到 127。代码在 128 到 255 之间的字符如果存储在 char 中看起来像负数。 ,这实际上就是您的调试器告诉您的内容:

    [0] -126 '‚'    char

    那是 -126,不是 126。换句话说,130 或 0x8C。

  2. isalnum和 friend 一起拍int作为参数,它(如错误消息所示)被限制为值 EOF (在您的系统上为 -1)和范围 0-255。 -126 不在此范围内。因此错误。你可以转换为 unsigned char , 或者(可能更好,如果它在 Windows 上工作),使用两个参数 std::isalnum in <locale>

  3. 出于我完全无法理解的原因,Windows 似乎在 CP-437 中提供控制台输入。但在 CP-1252 中处理输出.这两个代码页的高半部分完全不同。所以当你输入 é ,它从 CP-437 作为 130 (0xC2) 发送到您的程序,但是当您将相同的字符发送回控制台时,它根据 CP-1252 打印为(低)开放单引号 (看起来很像逗号,但实际上不是)。所以那是行不通的。您需要让输入和输出位于同一代码页上。

  4. 我对 Windows 了解不多,但您可能可以在 MS docs 中找到一些有用的信息。 .该页面包含指向特定于 Windows 的函数的链接,这些函数设置输入和输出代码页。

  5. 有趣的是,您程序源代码中的重音字符似乎是 CP-1252,因为它们打印正确。如果您决定放弃代码页 1252——例如,通过采用 Unicode——您还必须修复您的源代码。

关于c++ - 如何读取 C++ 中的重音字符并将它们与 isalnum 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34366259/

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