Проблема состоит в том, что пустое пространство (в том числе и переводы строк) в scanf()
строк формата ведет себя особенно — это означает произвольную последовательность символов пробела.
Когда он запрашивает Nome:
, вы можете ввести имя ('Александр Великий') и новую строку, но scanf()
продолжает читать, пока не встретится с другим символом, который не является пробелом. Таким образом, вы можете ввести «Завоеватель Азии», а затем появится подсказка Descricao:
, и она будет считываться до тех пор, пока вы не наберете еще один символ, который не является белым, а затем он будет завершен.
Например:
$ ./name-prompt
Nome: Alexander The Great
Conqueror of Asia
Descricao: a
<<Alexander The Great>> - <<Conqueror of Asia>>
$
Это из кода:
#include <stdio.h>
#include <stdlib.h>
struct s_Especialidade{
char nome[60];
char descricao[60];
struct s_Especialidade *proximo;
};
typedef struct s_Especialidade Especialidade;
typedef Especialidade *PESPECIALIDADE;
static
void novaEspecialidade(void)
{
PESPECIALIDADE novo = malloc(sizeof(Especialidade));
printf("\nNome: ");
if (scanf("%59[^\n]\n", (novo->nome)) != 1)
printf("Oh, bother!\n");
printf("\nDescricao: ");
if (scanf("%59[^\n]\n", (novo->descricao)) != 1)
printf("Oh, bother!\n");
novo->proximo = NULL;
printf("\n<<%s>> - <<%s>>\n", novo->nome, novo->descricao);
free(novo);
}
int main(void)
{
novaEspecialidade();
return 0;
}
Обратите внимание, что printf()
выход заканчивается символом новой строки; это вообще хорошая идея.
Чтобы обойти эту проблему, измените формат scanf()
на:
"%59[^\n]"
После scanf()
, сделать эквивалент:
int c;
while ((c = getchar()) != EOF && c != '\n')
;
пакет в функцию — может быть gobble()
или read_to_newline()
.
Или используйте fgets()
, чтобы прочитать строку и sscanf()
, чтобы разобрать ее; что часто работает лучше.
Добро пожаловать в Переполнение стека. Вскоре прочитайте [FAQ]. Вы всегда можете отредактировать свой собственный вопрос; На этот раз я пересадил дополнительную информацию в этот вопрос, но вы тоже могли бы это сделать. Поскольку вы не проверяете возвращаемое значение из 'scanf()', вы не можете сказать, счастлив он или нет. Какова была операция чтения до этого? Он удостоверился, что прочитана новая строка? –