Передача раздела массива в C

Если у меня есть массив массива символов char *str[] = {"qwe", "asd", ..., "hello", "there" ,"pal"};

Как мне передать этот массив, но с определенным диапазоном функции (в частности, execv), например передать только «asd» до «hello»?

Я знаю, что вы можете передать что-то вроде str+1, чтобы пропустить первое. Это возможно?

Возможный дубликат Передать часть массива в качестве аргумента функции

bishop 21.02.2019 06:09

Как вы говорите, вы можете передать указатель char **ptr, указывающий на запись "asd", и сказать N значений (так, чтобы ptr[N] указывал на "hello"). Однако вам нужно куда-то скопировать эти указатели, прежде чем использовать их с execv(), потому что для этого требуется список, заканчивающийся нулевым указателем. Или вам нужно разрешение, чтобы заменить "there" указателем NULL.

Jonathan Leffler 21.02.2019 06:09

@bishop, который здесь не полностью применим, поскольку массив в этом вопросе не завершается дозорным.

Antti Haapala 21.02.2019 06:22

Вы передаете str + start и целое число, указывающее длину диапазона. В C нет массивов переменной длины.

sudo 21.02.2019 06:36

@sudo, конечно, в c есть массивы переменной длины. Их даже называют...*массивами переменной длины». И, как уже сказал Джонатан, execv* работает не так.

Antti Haapala 21.02.2019 07:15

@AnttiHaapala «Массивы переменной длины» в C — это не то, что вы ожидаете от массивов переменной длины. Вы не можете передать их другим функциям и сообщить им длину, если только вы не используете часовой или что-то в этом роде.

sudo 03.03.2019 04:19

@sudo это не вопрос. Это массивы, и их длина является переменной, и они называются массивами переменной длины.

Antti Haapala 03.03.2019 09:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
616
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете сделать это для execv(), как сказано на странице руководства:

The list of arguments must be terminated by a null pointer, and, since these are
       variadic functions, this pointer must be cast (char *) NULL.

Использование str в execv() похоже на следующий пример

void func1(char *str[])
{
    for(int i=0; str[i]!=NULL; i++)
        printf("%s:%s\n", __func__, str[i]);
}

Однако, если функция имеет объявление и использование, например:

void func2(char *str[], int n)
{
    for(int i=0; i<n; i++)
        printf("%s:%s\n", __func__, str[i]);
}

вы можете назвать это следующим образом, чтобы передать только «asd» до «hello».

func2(str+a, n);
//where str[a] is "asd" and str[a+n-1] is "hello"

Приведение относится к execl* не execv* функциям

Antti Haapala 03.03.2019 09:11

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