Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找出用户输入包含C中的非ASCII字符_C_Ascii_User Input_Fgets - Fatal编程技术网

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

如何找出用户输入包含C中的非ASCII字符,c,ascii,user-input,fgets,C,Ascii,User Input,Fgets,我正在使用fgets()读取用户输入,并检查是否存在一些不允许的符号 例如,如果用户键入“š”,我会注意到它,因为“š”的值高于127。但是当用户输入“ασΔφ”或“жжжФ”时,我的代码将不起作用,因为这些符号将被完全忽略并替换为“?” 我的代码: char input[100]; fgets(input, 100, stdin); for (int i = 0; i < strlen(input) - 1; i++) { /// Check, if input[i] is AS

我正在使用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
}
char输入[100];
fgets(输入,100,标准输入);
对于(int i=0;i
当用户输入“š”时,变量输入中将为“š”。但当用户输入“掴”时,int变量输入将是“?”,问号是有效的ASCII字符

如何修复它

编辑:

操作系统:Windows 10

IDE:Visual Studio 2015

代码:

for(大小i=0;i127*/)
{
误差=4;
打破
}
}
如果我暂停一个程序,用户输入“ασΔφ”的数组输入的内容是63,63,63,63,10

编辑2:


现在我完全糊涂了。我试着在Ubuntu上编译和运行,一切正常。但在Windows上,它仍在用问号取代非ASII符号。你知道如何让它在Windows上工作吗?

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

#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 */
    }
}
#包括
字符输入[100];
fgets(输入,100,标准输入);
对于(int i=0;i
您也可以使用此选项:

#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");
}
}
#包括
main(){
字符输入[100];
fgets(输入,100,标准输入);
对于(int i=0;i
从您提供的详细信息很难判断,但我认为问题不在您的代码中。当您提到它在Ubuntu上工作时,这暗示您的控制台遇到了编码问题

如果stdin是一个文件句柄,这不应该是一个问题,但听起来您正试图从命令行和复制/粘贴输入中使用stdin。如果控制台字体不支持,Windows命令提示符将unicode字符转换为“?”。有关详细信息,请参阅此问题和接受的答案:


你是如何运行你的代码的?你是说
fgets
会将它们写入你的缓冲区(数组
输入
)正如
?如果你在调试器中逐字节查看内容,实际值是
的ASCII码?我真的很难相信。你使用的是什么操作系统?你在哪种终端上运行程序?你的本地设置是什么?“我的代码不起作用”和“输入将”?“-->发布进行打印的代码。类型
char
可以是有符号的,也可以是无符号的,这是特定于实现(编译器)的。这意味着如果
char
未签名,则
input[i]<0
将是错误的。Visual Studio 2015
使用哪种编译器?
#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");
}
}