For-l oop logi c для печати введенного символа с использованием scanf n раз - PullRequest
2 голосов
/ 18 февраля 2020

Я пытался понять логику c, стоящую за этим для l oop, но я не смог. Задача состоит в том, чтобы ввести целое число n (количество тестовых случаев), за которым следует n символов, каждый из которых обозначает день недели. Поэтому мне нужно вывести число дней n раз.

#include <stdio.h>
int main()
{
    int n, i;
    char ch;

    scanf("%d",&n);

    for (i = 0; i < 2 * n; i += 1)
    {
        scanf("%c", &ch);
        switch (ch)
        {
        case 'M':
            printf("Monday\n");
            break;
        case 'T':
            printf("Tuesday\n");
            break;
        case 'W':
            printf("Wednesday\n");
            break;
        case 'H':
            printf("Thursday\n");
            break;
        case 'F':
            printf("Friday\n");
            break;
        case 'S':
            printf("Saturday\n");
            break;
        case 'N':
            printf("Sunday\n");
            break;
        }
    }
    return 0;
}

Я не понимаю логи c для i<2*n. Так, например, когда я ввожу n=2, за которым следуют символы M M, а i инициализируется 0, проверяется условие для 0 < 4, которое является истинным, поэтому вводится первый символ M, и Monday печатается один раз, теперь i увеличивается до 1 и проверяется на 1 < 4, который имеет значение true и печатается еще раз. Теперь он уже был напечатан дважды, но в соответствии с i < 2 * n logi c не должен ли Monday печататься 4 раза, пока 4 < 4 не прекратит работу для l oop?

Но этот лог c как-то работает правильно.

Мой лог c для i <= n, почему-то не работает и только вводит и печатает символ один раз. Куда я здесь не так?

1 Ответ

1 голос
/ 18 февраля 2020

scanf("%c", &ch); сканирует введенный вами символ, но символ новой строки \n, вызванный enter, остается в буфере (то же самое верно и для предыдущего scanf в вашем коде), это вызывает чтобы l oop запускался 2 раза для каждого ввода: сначала сканируется сам символ, а затем \n. Это причина, по которой ваш for l oop должен запускаться 4 раза вместо 2, которые должны.

Вам нужно будет сбросить эти \n символы. Вы можете использовать %*c, чтобы отменить их, затем вы можете заменить n*2 на n в for l oop, преимущество в том, что l oop работает только в половине случаев, которые у вас есть сейчас.

Это работает не только для входных блоков, разделенных пробелами, но и для поочередных входов.

Ссылка на действующий семпл

//...
scanf("%d%*c", &n); //<-- dicard newline character

for (i = 0; i < n ; i += 1) {
    scanf("%c%*c", &ch); //<-- discard newline character
//...
...