Я попытался использовать библиотечную функцию gets()
в C и обнаружил, что вывод инструкции printf()
задерживается и отображается после того, как gets()
получает ввод со стандартного ввода (т.е. с клавиатуры). Пожалуйста, проверьте приведенный ниже код C и его вывод.
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, i, j;
char ch, *str;
printf("Enter size of input:\n");
scanf("%d\n", &n);
str = (char *) malloc(sizeof(char) * n);
printf("Enter input string: \n");
gets(str);
printf("Given input string is : %s\n", str);
return 0;
}
Выход:
Введите размер ввода: 9
R Радж Кумар ‹-- Это имя дается из ввода, так как программа ожидает ввода для функции gets(), даже если printf("Введите входную строку\n") присутствует перед gets() и оператор printf() не отображается на консоль. Он печатается после получения входных данных gets() с консоли.
Введите входную строку:
Данная входная строка: R Raj Kumar
gets
устарел по какой-то причине. - person Deduplicator   schedule 11.11.2016gets
устарела, как можно скорее переключитесь наfgets
. - person Weather Vane   schedule 11.11.2016gets()
< /a> по причинам, описанным в связанных вопросах и ответах. - person Jonathan Leffler   schedule 11.11.2016'\n'
вscanf("%d\n", &n);
задержках.scanf("%d\n", &n)
не возвращается до тех пор, пока после числа не будет введено непробельное пространство. @JonathanLeffler Не согласен с тем, что опубликованный обман является хорошим объяснением этого, что является первой из многих проблем с этим кодом. - person chux - Reinstate Monica   schedule 11.11.2016malloc
немного памяти, а затем используйтеfgets
для получения ввода. Теперьfgets
сохраняет введенное вамиnewline
в конце строки, поэтому, если входная строка не содержит такогоnewline
, вы знаете, что будут получены дополнительные данные. Таким образом, выrealloc
увеличиваете объем памяти и повторяете до тех пор, пока вход не будет содержать указанноеnewline
(илиfgets
не сработает). Но вы не должны смешиватьscanf("%d",...)
сfgets
— вместо этого используйтеfgets
, а затемsscanf
. - person Weather Vane   schedule 11.11.2016scanf
запрашивает ввод дважды, а я ожидаю, что запрошу только один - person Jonathan Leffler   schedule 11.11.2016\n
в форматеscanf()
"%d\n"
, как сказал Чукс. Убери это. Затем добавьте цикл 'gobble':int ch; while ((ch = getchar()) != EOF && ch != '\n') ;
(пустое тело цикла). Это читает завершающую новую строку. - person Jonathan Leffler   schedule 11.11.2016scanf()
, оставляющей символы новой строки (и завершающие пробелы или нецифры после цифр) в строке ввода. В качестве альтернативы, и очень часто, лучше читать только строки (все вводные с помощьюfgets()
), а затем анализировать строки с помощьюsscanf()
. Это имеет преимущества, не в последнюю очередь в том, что если первая попытка синтаксического анализа не сработает, вы можете попробовать еще раз с другим форматом и сообщить всю строку данных в сообщениях об ошибках. - person Jonathan Leffler   schedule 11.11.2016R[space]Raj[space]Kumar\0
-> 12char
s - person Elias Van Ootegem   schedule 11.11.2016