如何查找,该用户输入包含C中的非ASCII字符



我正在阅读使用fgets()的用户输入,我正在检查是否有一些不允许的符号。

例如,如果用户类型"Š",我会注意到它,因为"Š"的值比127更高。但是当用户类型"ασδφ"或"жщд则"时,我的代码将无法正常工作,因为这些符号完全忽略并被"?"代替。

我的代码:

char input[100];
fgets(input, 100, stdin);
for (int i = 0; i < strlen(input) - 1; i++)
{
    /// Check, if input[i] is ASCII symbol
}

当用户类型"Š"时,在可变输入中将为"Š"。但是,当用户类型"щ"时,int变量输入将是"?"问号是有效的ASCII字符。

如何修复它?

编辑:

操作系统:Windows 10

IDE:Visual Studio 2015

代码:

for (size_t i = 0; i < strlen(input); i++)
{
    printf("%c %dn", input[i], input[i]);
    if (input[i] < 0/* || input[i] > 127*/)
    {
        error = 4;
        break;
    }
}

如果我暂停了一个程序,则用户输入的阵列输入的内容"ασΔφ"为63、63、63、63、10。

编辑2:

现在我完全困惑了。我尝试在Ubuntu上编译和跑步,一切都很好。但是在Windows上,它仍在用问题标记代替非ASII符号。知道如何使其在Windows上工作?

我认为您应该使用ctype.h标题中定义的isascii(int ch)函数:

#include <ctype.h>
char input[100];
fgets(input, 100, stdin);
for (int i = 0; i < strlen(input) - 1; i++)
{
    if (isascii((int)input[i]) {
        /* If ASCII */
    } else {
       /*If non-ASCII */
    }
}

您也可以使用以下方式:

#include <stdio.h>
main(){
char input[100];
fgets(input, 100, stdin);
for (int i = 0; i < strlen(input) - 1; i++)
{
    if(input[i]<128 && input[i]>0)
        printf("nASCII Value");
    else
        printf("nNot an ASCII Value");
}
}

很难从您提供的详细信息中分辨出来,但是我认为问题不在您的代码中。当您提到它在Ubuntu上有效时,暗示您正在与控制台一起遇到编码问题。

如果stdin是文件句柄,这不是一个问题,但是听起来您正在尝试从命令行中使用stdin并复制/粘贴输入。Windows命令提示会将Unicode字符转换为"?"如果您的控制台字体不支持它们。有关更多信息,请参阅此问题和接受的答案:

使用?

是什么编码/代码页

相关内容

  • 没有找到相关文章

最新更新