Как я могу решить эту проблему неправильного вывода в консоли, используя c - PullRequest
1 голос
/ 16 апреля 2020

Вот мой код

int main(void) { 
  char c;
  int i = 0;
  while(i < 10) {
    c = getchar();
    printf("%c\n", c);
    i++;
  }
  return 0; 
}

Я хочу l oop 10 раз и получить ввод от пользователя, фактически только один символ за раз. и распечатайте его обратно на консоль. но проблема в выводе

a


b


c


d


e



Я зацикливаюсь 10 раз, но вход только 5 раз. Кто-нибудь может показать мне, в чем проблема?

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

getchar() вернет символы новой строки между буквами. Вы должны пропустить их.

Кроме того, остановитесь, если вы получили конец файла. Вам нужно изменить c на int, чтобы проверить это правильно.

int main(void) { 
  int c;
  int i = 0;
  while(i < 10) {
    c = getchar();
    if (c == EOF) {
      break;
    } else if (c != '\n')
      printf("%c\n", c);
      i++;
    }
  }
  return 0; 
}
1 голос
/ 16 апреля 2020

Вывод был выполнен ровно 10 раз.

Проблема в том, что функция getchar также считывает символы пробела, например, символ новой строки '\n', который соответствует нажатой клавише Enter.

Вместо getchar используйте функцию scanf, например

scanf( " %c", &c );

Обратите внимание на пробел перед символами% c. Необходимо пропустить символы пробела.

Программа может выглядеть, например, следующим образом.

#include <stdio.h>

int main(void) 
{
    const int N = 10;
    char c;

    for ( int i = 0; i < N && scanf( " %c", &c ) == 1; i++ )
    {
        printf( "%c\n", c );
    }

    return 0;
}

Если вы хотите использовать getchar, вам следует объявить переменную c как имеющий тип int.

В этом случае ваша программа может выглядеть следующим образом

#include <stdio.h>

int main(void) 
{
    const int N = 10;
    int c;

    int i = 0;
    while ( i < N && ( c = getchar() ) != EOF )
    {
        if ( c != '\n' )
        {
            printf( "%c\n", c );
            i++;
        }
    }       

    return 0;
}
1 голос
/ 16 апреля 2020

Вам нужно использовать символ новой строки ('\ n') из stdin каждый раз, когда вы получаете ввод

#include <stdio.h>

void flush() {
  int c;
  while((c = getchar()) != '\n');
}

int main(void) { 
  char c;
  int i = 0;
  while(i < 10) {
    c = getchar();
    flush();
    printf("%c\n", c);
    i++;
  }
  return 0; 
}
...