Я переосмыслил свой способ спрашивать. поэтому я отредактировал вопрос.
Я заранее знаю, сколько строк будет в массиве, потому что это текст меню.
предположим, у меня есть массив строк, объявленный так: char *menu_item[4];
это должно дать мне массив, который может содержать 4 строки, верно?
Я хочу иметь возможность передавать массив строк другим функциям, так можно ли это сделать?
Этот массив не объявлен в main. но в функции, вызываемой из main.
мне нужно будет выделить память для использования FX strcpy(menu_item[1],"some text");
и если да. что я должен выделить ??
или это menu_item[0] = "some text"
okay ??
У меня есть функция в функции для печати строк, которая принимает char *string
в качестве параметра. а сама функция принимает массив строк, поэтому char *items[]
выглядит так:
void scroll_menu(char *items[], int size){
for(int i = 0; i < size; i++){
print_out(items[i]);
}
}
правильный ли параметр для строкового массива?
Я просматривал много вопросов в Интернете. и, кажется, не могу найти ничего, что решило бы мою проблему.
если есть сомнения, я резюмирую, что я хочу:
char *string
, например, strcpy(menu_item[0], some_function_returning_string());
Моя проблема в том, что я перепробовал так много разных вещей, что меня смущает. и неправильно поняли операции с строковыми массивами.
Я также безуспешно пробовал с char menu_items[4][20];
, а затем с strcpy(menu_items[0], "some text");
. а затем возникает проблема с тем, как заставить функцию принимать массив, объявленный таким образом.
любые предложения о том, как достичь того, что я хочу, были бы очень хороши.
РЕДАКТИРОВАТЬ
Я потратил некоторое время на чтение книги по программированию на c и нашел то, что искал.
если я объявляю массив указателей на строки, так что char *menu_items[4]
, у меня будет массив, который может принимать 4 указателя на строки или массивы символов char *string
если я хочу назначить строку из функции, возвращающей char *
, у меня есть такая функция:
char *function_returning_string(int x){
static char *strings[3] = {"this","is","strings"};
if (x <= 2){
return strings[0];
}
else if (x > 2){
return string[1];
}
else{
return strings[2];
}
}
код, из которого я вызываю эту функцию, у меня следующее:
static char *other_strings = {"yes", "no"};
char *menu_item[3];
menu_item[0] = "ok";
menu_item[1] = other_strings[0];
menu_item[2] = function_returning_string(3);
тогда я могу просто передать весь массив строк функциям, которые принимают *string_array[]
в качестве параметра, так что function_takin_string_array(menu_item);
или любую строку внутри функций, принимающих char *string
в качестве параметра, так что function_taking_string(menu_item[2]);
код компилируется без ошибок и работает. Если кто-то думает, что с кодом что-то не так или если что-то неправильно понял, пожалуйста, дайте мне знать.
static char *addr; sprintf(addr, "S %d", i + 1); return addr;
Пара вопросов: 1) где вы выделяете память для addr
. 2) Я просто хочу убедиться, что вы понимаете, как работает static
в этом случае.
Я понимаю что ты имеешь ввиду. Это потому, что я где-то читал, что нужно "" возвращать строку в кавычках. Он должен быть статичным. Думаю, я этого не исправил. Но я смотрел вслепую уже несколько часов. Так что спасибо, что указали на эту проблему. А также то, что указатель не размещен.
Как заметил MFisherKDX, эта часть кода неверна:
static char *addr;
sprintf(addr, "S %d", i + 1);
return addr;
Как ты думаешь, что ты сюда возвращаешь? Это должно быть неудачно при вызове sprintf (), потому что вы пытаетесь присвоить какое-то значение нераспределенной памяти. Должно получиться так:
static char addr[128];
sprintf(addr, "S %d", i + 1);
return addr;
И как PeterJ_01, упомянутый выше, пытается использовать gdb, чтобы выяснить, что не так, а где у вас другие ошибки.
У вас здесь так много ошибок. Попробуйте воспользоваться отладчиком и сами проверьте, что не так.