Ввод в C. Scanf, прежде чем получает. проблема - PullRequest
10 голосов
/ 02 марта 2010

Я довольно новичок в 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 ]

12 голосов
/ 02 марта 2010

Попробуйте:

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

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

Edit:

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

...
scanf("%d", &a);
getc(stdin);
...
7 голосов
/ 02 марта 2010

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
2 голосов
/ 16 ноября 2010

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;
}
1 голос
/ 03 марта 2010
#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.
0 голосов
/ 05 января 2017

Функция 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

0 голосов
/ 05 июля 2016

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;
}
0 голосов
/ 09 января 2016

Просто используйте 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);

0 голосов
/ 04 августа 2013

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

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

для чтения ввода из scanf после прочтения get.

...