Как узнать, что пользовательский ввод содержит не ASCII-символы в C - PullRequest
4 голосов
/ 16 марта 2019

Я читаю пользовательский ввод с помощью 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.

Как это исправить?

EDIT:

Операционная система: Windows 10

IDE: Visual Studio 2015

Код:

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

Если я приостанавливаю программу, содержимое массива для пользовательского ввода "ασδφ" составляет 63, 63, 63, 63, 10.

РЕДАКТИРОВАТЬ 2:

Теперь я в полном замешательстве. Я попытался скомпилировать и запустить на Ubuntu, все работало нормально. Но в Windows он все еще заменяет не ASII символы на знаки вопроса. Любая идея, как заставить это работать на Windows?

Ответы [ 3 ]

3 голосов
/ 16 марта 2019

Я думаю, вы должны использовать функцию 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 */
    }
}
1 голос
/ 16 марта 2019

Вы также можете использовать это:

#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");
}
}
0 голосов
/ 16 марта 2019

Трудно сказать по предоставленным вами деталям, но я не думаю, что проблема в вашем коде. Когда вы упомянули, что он работает в Ubuntu, это намекает на то, что у вас возникла проблема с кодировкой вашей консоли.

Если stdin - это дескриптор файла, это не должно быть проблемой, но похоже, что вы пытаетесь использовать stdin из командной строки и копировать / вставлять ввод. Командная строка Windows преобразует символы Юникода в '?' если они не поддерживаются вашим консольным шрифтом. См. Этот вопрос и принятый ответ для получения дополнительной информации:

Какую кодировку / кодовую страницу использует cmd.exe?

...