Как я могу динамически вводить целочисленные значения и завершать цикл при нажатии клавиши ввода?

Мне нужно динамически вводить целочисленный ввод и завершать его, как только пользователь нажимает ввод. У меня никогда не было проблем с этим, когда я брал символы в качестве входных данных, поскольку я могу легко проверить наличие новых строк, и каждый символ представляет собой один символ. Но здесь я не могу просто взять ввод char и вычесть его на «0», так как когда я ввожу 10, значение char равно 1, а затем 0.

Вот кусок кода, который я использую:

int no;
while (scanf_s(" %d", &no) == 1)
    {
        printf("%d ", no);
    }

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

char no;
while ((no=getchar()) != EOF && no != '\n')
    {
        printf(" %d ", no - '0');
    }

Цикл scanf не завершается при нажатии клавиши ввода, но он правильно принимает все входные данные. Принимая во внимание, что цикл getchar завершается правильно, но сохраняет только однозначные целые числа.

Как я могу завершить ввод целых чисел при вводе пустой строки пользователем?


person Chase    schedule 07.08.2019    source источник
comment
Очень просто: не используйте scanf. Он определяется с точки зрения потокового ввода; у него нет понятия линий. Если вы хотите прочитать и интерпретировать строки ввода, используйте fgets для чтения строк как строк, а затем обработайте строки. (При этом вы также избежите множества других трудностей scanf.)   -  person Steve Summit    schedule 07.08.2019
comment
Когда вы используете %d с scanf, это означает, что вы пропускаете начальные пробелы, а затем читаете целое число, состоящее из одной или нескольких цифр. Невозможно отключить пропуск ведущей части пробела, что и вызывает вашу проблему.   -  person Steve Summit    schedule 07.08.2019
comment
Одна вещь, которую вы можете сделать (если вы хотите придерживаться scanf), это изменить подсказку с Ввод чисел, заканчивающихся пустой строкой, на Ввод чисел, заканчивающихся любым нечисловым символом. Если пользователь вводит x или что-то подобное, это приведет к ошибке scanf и возврату 0.   -  person Steve Summit    schedule 07.08.2019


Ответы (1)


Вы можете использовать стандартную функцию fgets для чтения ввода в массив символов, а затем извлекать числа, используя стандартную функцию strtol.

Вот демонстрационная программа

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int is_empty( const char *s )
{
    return s[strspn( s, " \t" )] == '\n';   
}

int main(void) 
{
    enum { N = 100 };
    char line[N];

    while ( fgets( line, N, stdin ) && !is_empty( line ) )
    {
        char *endptr;

        for ( const char *p = line; *p != '\n'; p = endptr )
        {
            int num = strtol( p, &endptr, 10 );
            printf( "%d ", num );

        }
    }

    return 0;
}

Если ввести следующие строки

1
2 3
4 5 6
7 8
9

(последняя строка пуста, пользователь только что нажал Enter)

тогда вывод будет выглядеть

1 2 3 4 5 6 7 8 9
person Vlad from Moscow    schedule 07.08.2019