Ввод в C. Scanf, прежде чем получает. проблема

Я довольно новичок в C, и у меня проблема с вводом данных в программу.

Мой код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
   int a;
   char b[20];

   printf("Input your ID: ");
   scanf("%d", &a);

   printf("Input your name: ");
   gets(b);   

   printf("---------");

   printf("Name: %s", b);   

   system("pause");
   return 0;
}

Он позволяет вводить идентификатор, но пропускает оставшуюся часть ввода. Если я изменю порядок следующим образом:

printf("Input your name: ");
   gets(b);   

   printf("Input your ID: ");
   scanf("%d", &a);

Это будет работать. Хотя я не могу изменить порядок, и мне нужно, как есть. Кто-нибудь может мне помочь? Может быть, мне нужно использовать некоторые другие функции. Спасибо!

8 ответов

Решение

Пытаться:

scanf("%d\n", &a);

get только читает '\n', из которого выходит scanf. Кроме того, вы должны использовать fgets not gets: http://www.cplusplus.com/reference/clibrary/cstdio/fgets/ чтобы избежать возможных переполнений буфера.

Редактировать:

если вышеописанное не работает, попробуйте:

...
scanf("%d", &a);
getc(stdin);
...

scanf не потребляет перевод строки и, таким образом, является естественным врагом fgets, Не соединяйте их без хорошего взлома. Оба эти варианта будут работать:

// Option 1 - eat the newline
scanf("%d", &a);
getchar(); // reads the newline character

// Option 2 - use fgets, then scan what was read
char tmp[50];
fgets(tmp, 50, stdin);
sscanf(tmp, "%d", &a);
// note that you might have read too many characters at this point and
// must interprete them, too

scanf не будет использовать \n, поэтому он будет принят get, который следует за scanf. очистить входной поток после scanf следующим образом.

#include <stdlib.h>
#include <string.h>

int main(void) {
   int a;
   char b[20];

   printf("Input your ID: ");
   scanf("%d", &a);
   fflush(stdin);
   printf("Input your name: ");
   gets(b);   

   printf("---------");

   printf("Name: %s", b);   

   system("pause");
   return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
        int a;
        char b[20];
        printf("Input your ID: ");
        scanf("%d", &a);
        getchar();
        printf("Input your name: ");
        gets(b);
        printf("---------");
        printf("Name: %s", b);
        return 0;
}



Note: 
  If you use the scanf first and the fgets second, it will give problem only. It will not read the second character for the gets function. 

  If you press enter, after give the input for scanf, that enter character will be consider as a input f or fgets.

Просто используйте 2 функции gets()

Когда вы хотите использовать gets() после scanf(), убедитесь, что вы используете 2 функции gets(), и для вышеприведенного случая напишите свой код следующим образом:

int main(void) {
   int a;
   char b[20];

   printf("Input your ID: ");
   scanf("%d", &a);

//the change is here*********************
   printf("Input your name: ");
   gets(b);
   gets(b);   
//the change is here*********************

   printf("---------");

   printf("Name: %s", b);   

   system("pause");
   return 0;
}

Для объяснения (isaaconline96@gmail.com);

Ты должен сделать это так.

    fgetc(stdin);
    scanf("%c",&c);
    if(c!='y')
    {
        break;
    }
    fgetc(stdin);

читать входные данные из Scanf после прочтения получает.

scanf("%d", &a); не могу прочитать ответ, потому что %d принимает только десятичное целое число. Таким образом, вы добавляете \n в начале следующего scanf игнорировать последнее \n внутри буфера.

Затем, scanf("\n%s", b); теперь может читать строку без проблем, но scanf перестает читать, когда найти пробел. Итак, измените %s в %[^\n], Это означает: "читать все, но \n"

scanf("\n%[^\n]", b);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    int a;
    char b[20];

    printf("Input your ID: ");
    scanf("%d", &a);

    printf("Input your name: ");
    scanf("\n%[^\n]", b);
    //first \n says to ignore last 'return'
    //%[^\n] read until find a 'return'  
    printf("---------\n");
    printf("Name: %s\n\n", b);   

    system("pause");
    return 0;
}

scanf Функция удаляет пробелы автоматически, прежде чем пытаться разобрать вещи, кроме символов. %c, %n, %[] исключения, которые не удаляют начальные пробелы

gets читает новую строку, оставленную предыдущим scanf, Поймать новую строку, используяgetchar();

scanf("%d", &a);
getchar(); // catches the newline character omitted by scanf("%d")
gets(b);

https://wpollock.com/CPlus/PrintfRef.htm

Другие вопросы по тегам