Я довольно новичок в C, и сейчас я работаю над программой, где я прошу пользователя вводить массивы символов (строки) в виде имен программ, сохраните эти имена в массиве, а затем передайте этот массив другой функции.Пользовательская строка ввода в массив, вызывающая переполнение буфера
Прямо сейчас, последний способ я пытался добиться этого с динамически выделяемым массивом, так как я не знаю, что пользователь может захотеть ввести, и вот как я делаю, что:
char *process;
process = (char *)malloc(sizeof(char) * (i+1));
я затем, чтобы запросить ввод пользователя и подтвердить ввод с printf
:
printf("Enter process name: ");
scanf("%79s", &process); // take input, load into array
// fgets(process, sizeof(ARRAY_SIZE), stdin);
printf("You entered: %s\n", process[i]);
Я попытался как scanf()
и fgets()
, где scanf()
на самом деле работает и fgets()
заставляет Программа для перехода полностью мимо моего printf
заявление и идет к этому:
for(i = 0; i < ARRAY_SIZE; i++)
printf("process = %s\n", process[i]);
который является, где программа завершается с Segmentation Fault
. Я понимаю, что это связано с тем, что пользовательский ввод перекрывает выделенный буфер.
В gdb
при печати значения процесса он заполняется мусором (который из моего понимания - это то, как C инициализирует массив до добавления значений). Сразу после scanf("%79s", &process)
процесс показывает, что мой вход добавлен в начале мусора вместо замены мусора. Мой вопрос заключается в том, как я «пустым» массивом, поэтому я отказываюсь от обхода буфера? В течение трех дней пробовал несколько методов, и я думаю, что это связано с тем, что я не хватает некоторых деталей того, как правильно инициализировать мой массив. У меня есть #define ARRAY_SIZE 80
, который должен быть более чем достаточным для его функционирования, хотя этого может и не хватить в последующих реализациях.
Любая помощь очень ценится.
Вы должны сказать нам, что 'i' и его значение, но еще' Scanf ("% 79s", и процесс); 'является неверно и должно быть 'scanf («% 79s », process);' – ouah
У вас есть кусочки кода, которые выглядят неправильно. Вы должны отправить сообщение [MCVE] (http://stackoverflow.com/help/mcve). Это будет полезно для всех, чтобы увидеть, что и где ваш код не совсем прав. –
Я инициализировал 'i' как' i = ARRAY_SIZE; '. Почему я должен делать 'scanf («% 79s », process)' в отличие от моей исходной версии? Я думал, что хочу загрузить вход в начальный адрес 'process'. Я собираюсь собрать MCVE для вас, ребята, поскольку у меня есть несколько других функций, которые отлично работают в программе, но делают это довольно долго. – TomJ