Только для чтения первого символа с помощью scanf

#c

#c

Вопрос:

Я пытаюсь прочитать только первый символ каждой строки, используя scanf.

С помощью этого ввода:

файл c: myciel3.col

источник c: Майкл Трик (trick@cmu.edu )

описание c: График, основанный на преобразовании Мичельского.

без треугольника c (номер клика 2), но увеличивающийся

номер раскраски c

p edge 11 20

Извините за мой плохой английский.

 int main(int argc, char *argv[]) {
    char option;
    int countC = 0;
    int countP = 0;
    while(scanf("%c",amp;option) != EOF) {
        if(option == 'c') countC  ;
        else if (option == 'p') countP  ;
    }
    printf("c: %dtp: %dn",countC, countP);
    return (0);
}
  

Я ожидаю, что на выходе будут C: 5 и P: 1, но фактический результат — c: 15 p: 2

Комментарии:

1. Это настоящее имя и адрес электронной почты? Если это так, было бы разумно анонимизировать их.

2.@Broman scanf() может вернуть EOF.

3. Почему бы просто не использовать getchar() ? scanf() является излишеством для чтения одного символа за раз.

4. @Shawn Я остаюсь исправленным. Я был так уверен, что это всегда неотрицательное значение, указывающее количество успешных назначений, но я ошибался.

Ответ №1:

Ваш код считывает каждый символ вашего ввода, а не первый символ каждой строки.

Используйте fgets или любую другую функцию, которая получает строку.

 #include <stdio.h>

int main(int argc, char *argv[]) {
    char option[255];
    int countC = 0;
    int countP = 0;
    while(fgets(option, 255, stdin) != NULL) {
        if(option[0] == 'c') countC  ;
        else if (option[0] == 'p') countP  ;
    }
    printf("c: %dtp: %dn",countC, countP);
    return (0);
}
  

Комментарии:

1. Запрос. Если теперь я хочу получить два числа из «p edge 11 20». else if (option[0] == ‘p’) { sscanf(option, «%d», amp;v); }

2. допустим, есть n1, n2 целочисленная переменная: sscanf(option, "p edge %d %d", amp;n1, amp;n2);