C - Делать при добавлении дополнительного шага - PullRequest
0 голосов
/ 18 октября 2019

Когда я запускаю приведенный ниже код, он выполняется правильно, но добавляет дополнительную итерацию, прежде чем я смогу снова ввести. Не уверен почему. Я собираюсь использовать его для родительского процесса fork и pipe для детей. Этот шаг наступит после того, как пользователь введет количество процессов.

Код:

#include <stdio.h> 

int main(void) {
    int num_processes;
    int running = 1;
    do {
        printf ("How many processes do you want? (1, 2 or 4) \n");
        num_processes = getchar();
        num_processes -= '0';

        if(num_processes == 1 || num_processes == 2 || num_processes == 4){
            int temp = num_processes - 1;
            printf("\n1 Parent and %d child processes\n", temp);
            printf("----------------------------------\n");
            running = 0;
        } else {
            printf("Invalid Input, please try again.\n");
        }
    } while(running == 1);

    // Do important stuff

    return(0);
}

Out:

How many processes do you want? (1, 2 or 4)
3
Invalid Input, please try again.
How many processes do you want? (1, 2 or 4)
Invalid Input, please try again.
How many processes do you want? (1, 2 or 4)
2

1 Parent and 1 child processes
----------------------------------

1 Ответ

1 голос
/ 18 октября 2019

Подумайте, что произойдет, когда вы сделаете свой первый вклад. Вы вводите 3, а затем нажимаете Enter.

Теперь в буфере стандартного ввода есть два элемента, ожидающих использования: 3 и \n (то есть Enter).

Вы вводите тело цикла в первый раз, 3 расходуется. Теперь следующий в строке ожидает \n ...

Когда вы снова вводите тело цикла (второй раз), следующий символ, который будет считан стандартным входным буфером, будет \n, и эточто радостно возвращается вам второй getchar().

Вот быстрое исправление:

do {
    printf ("How many processes do you want? (1, 2 or 4) \n");
    // Eat trailing newline character, if any
    do {
      num_processes = getchar();      // read a character
    } while(num_processes == '\n');   // if it was the newline character, repeat
                                      // until `num_processes` is not the newline character

    // Continue with your logic..
    num_processes -= '0';

Вывод:

How many processes do you want? (1, 2 or 4) 
3
Invalid Input, please try again.
How many processes do you want? (1, 2 or 4) 
2

1 Parent and 1 child processes
----------------------------------

PS: Как прокомментировал @Barmar,если вы хотите прочитать строки, используйте fgets(). Подробнее здесь: Как использовать fgets () для управления выполнением цикла while через пользовательский ввод в c?

...