чтение символа пробела в строку с размером, определенным str_size - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь сделать эту программу такой, чтобы пользователь мог вводить любую заданную строку символов, и программа будет отделять буквенно-цифровые символы от остальных, печатать их во вторую строку и, наконец, выводить конечный результат на экран. .

Я уже пытался использовать scanf ("%[^\n]%*c", string);, но, похоже, он не работает, так как размер строки заранее не указан, а скорее определяется STR_SIZE.

char string[STR_SIZE];

printf("please type in a string \n");
scanf("%s", string);
printf("string: \n %s \n", string);
int size = (strlen(string));
char alfanumerico[STR_SIZE];
int count = 0;
int count2 = 0;

while(count <= size)
{
    if(string[count] >= '0' && string[count] <= '9')
    {
        alfanumerico[count2] = string[count];
        count2++;
    }
    if(string[count] >= 'a' && string[count] <= 'z')
    {
        alfanumerico[count2] = string[count];
        count2++;
    }
    if(string[count] >= 'A' && string[count] <= 'Z')
    {
        alfanumerico[count2] = string[count];
        count2++;
    }
    if(string[count] ==' ')
    {
        alfanumerico[count2] = string[count];
        count2++;
    }
    count++;
}

printf("alphanumerical characters typed: \n %s \n", alfanumerico);

Учитывая, что пользователь набрал строку, такую ​​как: -=-=[[][][]}}Hello 123 ```//././.

Я ожидаю, что результат будет: Hello 123

1 Ответ

1 голос
/ 06 июня 2019

scanf - это не тот путь, особенно если ваш ввод может содержать пробелы, на которых scanf прекратит читать больше входных данных и не сохранит, например, пробелы.

Вы должны использовать fgets, который позволяет ограничивать входные данные в соответствии с буфером, в котором эти данные хранятся. Так что-то вроде:

fgets(string, STR_SIZE, stdin)

должно работать.

О размере - у вас должно быть некоторое ограничение на максимальный размер строки, и тогда STR_SIZE должен быть установлен на это число. Это должно быть частью требований вашей программы или просто размера, который имеет смысл, если вы предъявляете требования. Он должен быть определен до того, как вы прочитаете ввод от пользователя, потому что буферная память выделяется до чтения.


Комментарий о стиле, не связанный с вашим вопросом - всегда старайтесь уменьшить дублирование кода до 0. Строка alfanumerico[count2] = string[count]; count2++; появляется в вашем коде 4 раза. Более элегантный минимальный оператор if с точно такой же функциональностью будет выглядеть так:

if ((string[count] >= '0' && string[count] <= '9') ||
    (string[count] >= 'a' && string[count] <= 'z') ||
    (string[count] >= 'A' && string[count] <= 'Z') || 
    (string[count] == ' '))
{
    alfanumerico[count2] = string[count];
    count2++;
}

и быть еще более минимальным:

char c = string[count];
if ((c >= '0' && c <= '9') ||
    (c >= 'a' && c <= 'z') ||
    (c >= 'A' && c <= 'Z') || 
    (c == ' '))
{
    alfanumerico[count2] = c;
    count2++;
}

Он также более читабелен и более удобен в обслуживании - если вы хотите изменить переменную count на i, вы делаете это в одном месте вместо 8.

Кроме того, всегда закрывайте область видимости в новой строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...