как принимать ввод до тех пор, пока не будет введен «только» символ новой строки или пробел? - PullRequest
0 голосов
/ 25 февраля 2019

я пытаюсь создать цикл, который продолжает цикл до тех пор, пока не будет введен «только» символ новой строки или, возможно, просто пробел (пока ничего не введено в строку ввода).

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

    int main()
    {
        int num;
        while(1)
        {
            scanf("%d",&num);
            if(num==NULL)
                break;
        printf("%d",num);
        }
        return 0;
    }

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Есть и другие вещи, которые могут быть в строке, кроме целого числа.Ваш код указывает ожидаемое целое число, но ваш текст только указывает, что строка пуста или содержит только пробел.

Учитывая ваш текст в вопросе:

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

int main( void )
{
    char line[1024];

    while( fgets( line, sizeof( line ), stdin ) )
    {
        if(   (strlen( line ) == 1 ) 
          ||  (strlen( line ) == 2  && line[0] == ' '))
        {
            // all done
            break;
        }
        else
        {
            // process line
        }
    } // end while
}
0 голосов
/ 25 февраля 2019

Вы не можете сделать это с scanf (по крайней мере, не легко).Если вы хотите обрабатывать пользовательский ввод, scanf - плохой выбор (фактически, за все мои годы разработки на C я никогда не использовал scanf; я рекомендую вам вообще избегать его).

num==NULL не имеет смысла: num - это число, но NULL - это значение указателя.Если вы хотите проверить, был ли scanf успешным, вам нужно проверить его возвращаемое значение.

Я бы сделал что-то вроде:

char line[100];
while (fgets(line, sizeof line, stdin)) {  // read input line by line
    int num;
    if (sscanf(line, "%d", &num) != 1) {  // the line didn't start with a valid integer
        break;
    }
    printf("%d\n", num);
}

Если вы хотите проверить специально дляпустая строка, а не просто нечто, не похожее на число, вы можете использовать strspn:

if (line[strspn(line, " \t\n")] == '\0') {
    // line contains spaces / tabs / newlines only
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...