Получение строки пользовательского ввода в C справке. - PullRequest
0 голосов
/ 03 мая 2011

Я был во всем Интернете и пробовал кучу разных вещей, но, похоже, они никогда не работают. Каждый раз, когда я запускаю программу, она упускает возможность ввести что-то для имени ученика и идет прямо в отдел. Кроме того, мы новичок в C, и нам действительно сказали использовать printf и scanf, но когда пользователь вводит имя, например, joe shmo, он делает странные вещи.

fputs("Please enter the students name: ", stdout);
fflush(stdout);
fgets(studentArray[empty].name, sizeof studentArray[empty].name, stdin);

printf("\nPlease enter the students department: ");
scanf("%s", studentArray[empty].department);
printf("\nPlease enter the students rank: ");
scanf("%d", &studentArray[empty].rank);

РЕДАКТИРОВАТЬ: странные вещи, как, например, если я введу два имени, то есть joe shmo, он примет имя joe и автоматически добавит shmo в отдел. studentArray - это массив структуры, которую я создал ...

typedef struct {
char name[MAX_NAME_LENGTH];
char department[MAX_DEPT_LENGTH];
int rank;
} student;

Ответы [ 2 ]

4 голосов
/ 03 мая 2011

Когда программа достигает fgets() Бьюсь об заклад, во входном буфере находится ожидающий '\n' от предыдущего scanf().Я предлагаю вам избавиться от этого '\n' и любого предыдущего ввода.

Например, с помощью

int getridofextrainput(void) {
  int ch;
  while (((ch = getchar()) != '\n') && (ch != EOF)) /* void */;
  return ch;
}

Затем используйте эту функцию в своем коде там, где вы считаете это необходимым (до fgets).

0 голосов
/ 22 апреля 2013

Это то, что происходит, когда вы смешиваете fscanf и fgets.

Когда fscanf читает число, оно останавливается прямо в конце этого числа, перед следующего символа новой строки. Когда впоследствии fgets читает строку, он останавливается на следующем символе новой строки, который, к сожалению, следует сразу.

Если вы используете только fscanf для чтения всех данных, проблем не будет. Это не тривиально, потому что некоторые из ваших имен содержат пробелы. Можно прочитать имя, содержащее пробел, используя fscanf, например:

scanf("%[^\n]", studentArray[empty].department);

Если вы используете только fgets для чтения всех данных, вы тоже будете в порядке. К сожалению, это тоже не тривиально: для чтения чисел требуется временный буфер.

char temp[42];
fgets(temp, sizeof temp, stdin);
sscanf(temp, "%d", &studentArray[empty].rank);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...