Нужно ли иметь два scanf или getchar () внутри и снаружи al oop? - PullRequest
1 голос
/ 27 марта 2020

Я видел эту маленькую программу, которая вычисляет длину символов в моей книге практики, и я немного запутался. Почему есть два getchar(), один снаружи и один внутри l oop?

Я удалил getchar() за пределами l oop и не вижу никакой разницы. Есть ли последствия, если я удалю это?

Вот код:

#include <stdio.h>
char ch;
int len;

printf("Enter your message:");
ch = getchar();

while(ch != '\n') {
    len++;
    ch = getchar();
}

printf("Your message is %d characters long", len);
return 0;

А вот моя модифицированная версия, я понятия не имею, есть ли какие-либо последствия c, так как вывод такой же:

#include <stdio.h>
char ch;
int len;

printf("Enter your message:");

while(ch != '\n') {
    ch = getchar();
    len++;
}

printf("Your message is %d characters long", len);
return 0;

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Оба фрагмента кода могут вызывать неопределенное поведение , поскольку len не может быть инициализировано (если это не глобальная переменная, в этом случае она будет инициализирована до 0, хотя для этого нет веской причины) для этого).

Ваш код замены имеет 2 fl aws, удаление внешнего getchar() заставляет программу вычислять ch перед ее инициализацией, вызывая снова неопределенное поведение, и она считает на один символ больше, чем фактическая длина char array.

Существует несколько способов исправить это, одним из них может быть изменение while на do-while l oop и инициализация len на -1:

Рабочий образец

#include <stdio.h>

int main() {

    int ch, len = -1;

    printf("Enter your message:");

    do {        
        ch = getchar();
        len++;
    } while (ch != '\n' && ch != EOF); //allways a good practice to check for EOF

    printf("Your message is %d characters long", len);
    return 0;
}
1 голос
/ 27 марта 2020

Без getchar снаружи значение ch не инициализируется, что означает, что есть шанс, что для начала может быть \n, а l oop никогда не запустится. Кроме того, с вашим l oop сообщаемая длина на единицу больше, чем фактическая длина (a\n отображается как длина 2, когда она должна быть длиной 1).

...