Попробуйте:
scanf("%d\n", &a);
получает только чтение '\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("%d%*c", &a)
должно работать. Термин %*c
заставляет scanf
читать один символ (новая строка), но звездочка вызывает отбрасывание значения. Это заставит scanf
съесть новую строку, не требуя отдельного вызова функции.
– bta
2 March 2010 в 21:57
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);
вы должны сделать это.
fgetc(stdin);
scanf("%c",&c);
if(c!='y')
{
break;
}
fgetc(stdin);
, чтобы читать ввод от scanf после прочтения.
#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.
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;
}
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;
}
Просто используйте функции 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);