我正在阅读使用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字符转换为"?"如果您的控制台字体不支持它们。有关更多信息,请参阅此问题和接受的答案:
使用?