Мне нужно получить ввод для строк n
(вводится пользователем). Для этого я начинаю с определения двумерного массива char str [] [] .
Я использовал цикл for
, получая ввод от пользователя, и пробовал оба gets()
и fgets()
.
Хотя в примере кода я использовал gets ().
Но он всегда принимает ввод для n-1 строк, то есть на 1 меньше, чем пользователь хочет ввести.
При дальнейшей проверке я обнаружил, что программа не принимает входных данных для 0-я строка, то есть начальной строки.
Мой код:
#include <stdio.h>
int main(void){
int i, n;
printf("how many string you want to enter: ");
scanf("%d", &n);
char str[n][60];
printf("start entering strings:\n ");
for(i=0;i<n;i++){
gets(str[i]); //have used here fgets() also
}
puts(str[0]); //no output for Oth string
return 0;
}
Выход:
how many string you want to enter:
Пользовательский ввод - 3
how many string you want to enter: 3
start entering strings:
Окончательный результат:
how many string you want to enter: 3
start entering strings:
abc
bcd
Здесь программа завершается после ввода только двух строк и отсутствия вывода для puts(str[0]);
.
Хотя ввод данных с scanf()
, поскольку scanf("%s", str[i]);
работал отлично.
Я хочу знать, почему использование gets()
, fgets()
не работает.
также попробовали fgets
. проблема в том, что он не принимает ввод для str [0]
Вам нужно использовать оставшийся буфер, оставленный scanf
:
scanf("%d", &n);
char str[n][60];
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF);
printf("start entering strings:\n ");
Вы можете избежать уродливого цикла промывки, используя fgets
и strtol
вместо scanf
:
char buf[32];
int i, n = 0;
printf("how many string you want to enter: ");
if (fgets(buf, sizeof buf, stdin)) {
n = (int)strtol(buf, NULL, 10);
}
char str[n][60];
printf("start entering strings:\n ");
Я не понял.
У вас есть хорошее объяснение от @Someprogrammerdude в другом ответе.
@asynts, вот почему я предлагаю fgets
и strtol
, вы также можете проверить, действителен ли ввод, используя второй параметр, но это оставлено как упражнение для OP :)
Проблема не в fgets
(или gets
, если на то пошло). Проблема заключается в вашем предыдущем звонке на scanf
.
Когда вы заканчиваете ввод числа с помощью клавиши Enter, эта клавиша Enter будет добавлена во входной буфер как новая строка. Таким образом, после того, как scanf
прочитал номер, следующим символом, оставшимся во входном буфере, будет эта новая строка. И это первый символ, который fgets
прочитает как пустую строку. Таким образом, делает прочитал все строки, но первая будет считаться пустой.
Вот почему вы не используете казаться, чтобы получить какой-либо вывод, потому что нет печатаемых символов для печати. Все, что вы получаете, - это пустая строка.
Я думаю, самая большая проблема - я использую неправильный текст для изучения C. :(
сообщество поможет мне выбрать правильный источник?
@Vartika выберите тег [c] и нажмите «Узнать больше», есть много советов, включая ресурсы и книги: stackoverflow.com/tags/c/info.
Начнем с того, что никогда не используйте Когда-либо
gets
. Это опасная функция, и поэтому он даже был удален из стандарта C.