验证ASCII字符的输入

exs*_*ake 6 c ascii char

我有一个家庭作业问题.我必须验证大写字符的输入,但是我遇到了A到Z的问题.

我只是把它while (c<65 || c>90),它工作正常.但是,在我的国家,我们也使用Ñ,所以这是我的问题.我尝试使用ascii代码165来验证条目,但它不起作用.

char范围是-128到127,所以对于扩展的ASCII表我需要一个unsigned char吗?

我试过这个:

int main (){
    unsinged char n;

    //scanf("%c",&n);
    printf("%c",n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果它扫描'Ñ'则打印165.

下一个:

unsigned char n;
n='Ñ';
printf("%d",n);
Run Code Online (Sandbox Code Playgroud)

pPrints 209.

所以我尝试用165和209验证,但都不起作用.

为什么会这样?我该怎么做才能验证此角色的输入?


当我使用unsigned char和验证165时它的作品.但是当我使用cmd通过读取txt文件来尝试它时,没有工作......

pab*_*977 6

如果我扫描'Ñ',则打印165.

打印209.

  • 这会为您在IDE中手动输入的字符显示不同的编码.
    Mark Tolonen建议它与OEM cp437相对应.
    (我最初与UTF-8联系,我现在有点困惑......)

C中你必须考虑到两个字符的整理顺序的存在,这可能是不同的:

  1. 源字符集.
  2. 执行字符集.

源字符集是指编辑环境使用的编码,即您通常键入.c文件的位置.您的系统和/或编辑器和/或IDE正在使用特定的编码模式.在这种情况下,似乎编码是UTF-8.

因此,如果在编辑器中编写"Ñ",则字符Ñ具有编辑器的编码,并且没有目标系统的编码.在这种情况下,你有Ñ编码为209,这给你'Ñ' == 209真实.

执行字符集是指在操作系统和/或用于运行可执行(即编译)程序的控制台中使用的编码.很明显,编码是拉丁语1(ISO-8859-1).

特别是,当您在系统的控制台中键入Ñ时,它编码为165,在打印值时为您提供值165.

由于这种二分法总是可以发生(或不发生),你必须对此加以警惕,并做出一些调整,以避免潜在的问题.

当我使用unsigned char并使用165进行验证时,它的工作原理.但是当我使用cmd通过读取txt文件来尝试它时,它不起作用...

  • 这意味着您的.txt文件是使用文本编辑器(可能是您自己的IDE)编写的,即使用与Latin 1(ISO-8859-1)不同的编码.

让我猜一下:您正在使用相同的IDE编写C代码和文本文件,但是您正在从Windows CMD执行程序.

这里有两种可能的解决方案.

复杂的解决方案是您调查编码模式,区域设置问题宽字符.这里没有快速的解决方案,因为它需要注意几个微妙的东西.

简单的解决方案是对您正在使用的所有工具进行调整.

  1. 转到IDE的选项并尝试获取用于保存文本文件的编码模式的信息(我猜你有UTF-8,但你可以有其他可能性,比如LATIN 1(或ISO-8859-1) ,UTF-16和大型等):
  2. 在CMD中执行命令CHCP以获取系统正在使用的代码页编号.此代码页是一个数字,其含义在我的Microsoft中解释,此处:

    一个.OEM代码页
    b.Windows代码页
    c.ISO代码页
    d.所有WINDOWS CODEPAGES的列表

    我想你有代码页850或者好28591(对应于拉丁语1).

  3. 更改其中一个配置以适应另一个配置.

    一个.在IDE的配置中,在"编辑器选项"部分中,您可以将编码更改为拉丁语1ISO-8859-1.

    湾 或者,通过CHCP命令更好地更改CMD中的代码页,以适应OEM 437编码:

    CHCP 437

可能涉及CMD 中代码页更改的解决方案并不总是像预期的那样工作.
解决方案(a.)更安全:修改编辑器的配置.
但是,可以预先将UTF-8保留在编辑器中(如果这是编辑的选择),因为现在每个现代软件都转向UTF编码(Unicode).

新信息:UTF-8编码有时使用超过1个字节来表示1个字符.下表显示了前256个入口点的UTF-8编码:

注意:在评论中进行了一些讨论后,我意识到我对UTF-8编码有一些错误的认识.至少,这说明了我的观点:编码不是一件小事.

所以,我必须在此重复我对OP的建议:走最简单的路径,尝试与老师就如何处理特殊字符的编码达成协议.