Ввод строкового ввода с использованием функции gets () в C [duplicate]

9
задан Dmitri 2 March 2010 в 21:30
поделиться

8 ответов

Попробуйте:

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

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

Изменить:

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

...
scanf("%d", &a);
getc(stdin);
...
10
ответ дан IVlad 26 August 2018 в 09:54
поделиться
  • 1
    Гектометр Я попробовал scanf (& quot;% d\n & quot ;, & amp; a); но он, похоже, не работает. После ввода идентификатора я просто не вижу, как программа делает что-то еще. – Dmitri 2 March 2010 в 21:37
  • 2
    Вау! Благодаря! Это работало безупречно! Спасибо за совет о fgets. Будет использовать его! Спасибо! – Dmitri 2 March 2010 в 21:47

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
7
ответ дан AndiDog 26 August 2018 в 09:54
поделиться
  • 1
    Потрясающие!! Большое спасибо! – Dmitri 2 March 2010 в 21:51
  • 2
    Кроме того, использование scanf("%d%*c", &a) должно работать. Термин %*c заставляет scanf читать один символ (новая строка), но звездочка вызывает отбрасывание значения. Это заставит scanf съесть новую строку, не требуя отдельного вызова функции. – bta 2 March 2010 в 21:57
  • 3
    Вы представляете оба варианта, как если бы они были равными, но scanf настолько трудно правильно использовать, что гораздо лучше не использовать его полностью (см. Ссылку на comp.lang.c FAQ). Просто перейдите с опцией 2. – jamesdlin 3 March 2010 в 04:23

Функция 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
ответ дан Duy Đặng 26 August 2018 в 09:54
поделиться

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

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

, чтобы читать ввод от scanf после прочтения.

0
ответ дан Madan Ram 26 August 2018 в 09:54
поделиться
#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.
1
ответ дан muruga 26 August 2018 в 09:54
поделиться

scanf не будет потреблять\n, поэтому он будет приниматься с помощью gets, следующего за 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;
}
2
ответ дан pmg 26 August 2018 в 09:54
поделиться
  • 1
    И fflush (stdin), и fflush (NULL), в некоторых библиотеках C, будут flush stdout и stderr, но это совершенно невозможно! – Tarnay Kálmán 29 November 2010 в 23:08

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
ответ дан Rogério De Leon Pereira 26 August 2018 в 09:54
поделиться

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

. Если вы хотите использовать gets () после scanf (), вы убедитесь, что используете 2 функции gets (), и для вышеуказанного случая write ваш код:

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
ответ дан Trevor 26 August 2018 в 09:54
поделиться
  • 1
    добро пожаловать в СО! Пожалуйста, помните, что английский не является первым языком для всех здесь, поэтому старайтесь публиковать ответы, которые являются грамматически правильными, вместо того, чтобы использовать «u» для «вас», что не будет работать с Google Translate! – Dave Mulligan 9 January 2016 в 10:59
Другие вопросы по тегам:

Похожие вопросы: