Строковый массив C, назначение и передача и т. д

Я переосмыслил свой способ спрашивать. поэтому я отредактировал вопрос.

Я заранее знаю, сколько строк будет в массиве, потому что это текст меню. предположим, у меня есть массив строк, объявленный так: char *menu_item[4]; это должно дать мне массив, который может содержать 4 строки, верно?

Я хочу иметь возможность передавать массив строк другим функциям, так можно ли это сделать?

Этот массив не объявлен в main. но в функции, вызываемой из main.

  1. мне нужно будет выделить память для использования FX strcpy(menu_item[1],"some text"); и если да. что я должен выделить ?? или это menu_item[0] = "some text"okay ??

  2. У меня есть функция в функции для печати строк, которая принимает char *string в качестве параметра. а сама функция принимает массив строк, поэтому char *items[] выглядит так:

    void scroll_menu(char *items[], int size){
        for(int i = 0; i < size; i++){
            print_out(items[i]);
        }    
    }
    

    правильный ли параметр для строкового массива?

Я просматривал много вопросов в Интернете. и, кажется, не могу найти ничего, что решило бы мою проблему.

если есть сомнения, я резюмирую, что я хочу:

  1. Я хочу объявить массив строк, содержащий известное количество строк. иногда строки могут быть инициализированы в объявлении массива. а иногда мне приходится где-то искать, а затем «присваивать» или копировать результат в массив.
  2. Я хочу иметь возможность копировать или назначать ему строки из функций, возвращающих 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]);

код компилируется без ошибок и работает. Если кто-то думает, что с кодом что-то не так или если что-то неправильно понял, пожалуйста, дайте мне знать.

У вас здесь так много ошибок. Попробуйте воспользоваться отладчиком и сами проверьте, что не так.

0___________ 01.05.2018 17:30
static char *addr; sprintf(addr, "S %d", i + 1); return addr; Пара вопросов: 1) где вы выделяете память для addr. 2) Я просто хочу убедиться, что вы понимаете, как работает static в этом случае.
MFisherKDX 01.05.2018 17:30

Я понимаю что ты имеешь ввиду. Это потому, что я где-то читал, что нужно "" возвращать строку в кавычках. Он должен быть статичным. Думаю, я этого не исправил. Но я смотрел вслепую уже несколько часов. Так что спасибо, что указали на эту проблему. А также то, что указатель не размещен.

Morten Brask Jensen 01.05.2018 18:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
73
1

Ответы 1

Как заметил 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, чтобы выяснить, что не так, а где у вас другие ошибки.

Другие вопросы по теме