Счетчик внутри цикла for не дает ожидаемого выхода - PullRequest
1 голос
/ 10 апреля 2019

Эта программа сканирует некоторые символы и показывает, сколько 'x' было введено в качестве ввода. Я думаю, что вам лучше понять код, а не объяснение.

#include<stdio.h>
main()
{
    int n,i,t=0;
    scanf("%d",&n);
    char ara[n];
    for(i=0;i<n;i++)
    {
        scanf("%c", &ara[i]);
        if(ara[i]=='x') t++;
    }
    printf("%d",t);
}

предположим, n = 5 и символы были "xxxxxx". В этом случае значение t должно быть 5. Но он отображает 4.

Другое дело, что если вы удалите первый оператор scanf (строка 5) и вручную установите значение n = 5 везде в коде:

int n,i,t=0;
//scanf("%d",&n);
n = 5;

тогда значение t становится 5, что приводит к правильному выводу. Есть ли вероятность того, что внешняя функция scanf влияет на функцию scanf внутри цикла for?

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Ваш массив ara содержит символ новой строки сразу после ввода 5.Чтобы отбросить эту новую строку (и все новые строки и пробелы перед первым 'x'), вы должны поставить пробел после %d:

scanf("%d ",&n);

Редактировать

Вы можетеперед "% c" ставится пробел, как в ответе @Blaze, но тогда ввод будет выглядеть следующим образом:

 5
 x x x x x

Он будет читаться как 'x', 'x', 'x', 'x', 'x' вместо 'x', ' ', 'x', ' ', 'x'.

Приложение :

Если вы хотите сбросить только одну новую строку, а не все новые строки:

scanf("%d",&n);
while (true) {
    char ch = getchar();
    if (ch == EOF || ch == '\n') break;
}
1 голос
/ 10 апреля 2019

Это потому, что когда вы вводите n, вы также вводите новую строку (или пробел). Этот пробел остается в буфере, поэтому первым прочитанным символом будет не x, а этот пробельный символ.

Вы можете исправить это, сказав scanf, чтобы пропустить начальные пробелы. Изменить эту строку

scanf ("% c", & ara [i]);

К этому:

scanf ("% c", & ara [i]);

Пробел перед %c заставляет его игнорировать эту новую строку / пробел и вместо этого взять первый введенный x, что дает вам правильный результат. Вот как ссылка объясняет это:

Символ пробела: функция будет читать и игнорировать все пробелы символы, встречающиеся перед следующим непробельным символом (пробельные символы включают пробелы, символы новой строки и символы табуляции - см. isspace). Один пробел в строке формата проверяет любой количество пробельных символов, извлеченных из потока (включая нет).

...