Как передать массив в метод в C и редактировать содержимое? - PullRequest
1 голос
/ 02 декабря 2011

В основном у меня есть этот рабочий код, который манипулирует массивом строк:

for (i = 0; i < numentries; i++)
    if (strcmp(compare_str, strings[i]) < 0)
        break;
    for (j = numentries; j > i; j--)
        strcpy(strings[j], strings[j - 1]);
    strcpy(strings[i], compare_str);
    strcat(strings[i], " ");
    strcat(strings[i], whole_str);

numentries++;

Я хочу сделать так, чтобы я мог вызывать метод для выполнения таких манипуляций, как:

//call to method
compare(strings, numentries, compare_str, whole_str);
    numentries++;


//method
void compare(char array[], int entries, char compare[], char whole[]) {
    int i, j;
    for (i = 0; i < entries; i++)
        if (strcmp(compare, array[i]) < 0)
            break;
    for (j = entries; j > i; j--)
        strcpy(array[j], array[j - 1]);

    strcpy(array[i], compare);
    strcat(array[i], " ");
    strcat(array[i], whole);
}

Приведенный выше код не работает, я знаю, что вы должны использовать указатели, насколько я не совсем уверен, как. Как передать мой массив символов (строк), чтобы я мог манипулировать значениями внутри массива?

Я знаю, что это всего лишь фрагмент кода, но я подумал, что этого будет достаточно, чтобы решить мою проблему. если вам понадобится больше моей программы, дайте мне знать.

Он падает на линии

strcat(array[i], " ");

с сообщением

Программа получила сигнал SIGSEGV, Ошибка сегментации. 0x75bf8df6 в strcat () из C: \ Windows \ system32 \ msvcrt.dll n Один шаг до выхода из функции strcat, у которой нет информации о номере строки. 0x77776299 в ntdll! LdrGetDllHandleByName () из C: \ Windows \ system32 \ ntdll.dll

Ответы [ 3 ]

1 голос
/ 02 декабря 2011
void compare(char *array[], int entries, char compare[], char whole[]) {
                  ^

Доказательство: http://ideone.com/6xSaq

0 голосов
/ 02 декабря 2011

Учитывая объявление char strings[30][161];, я думаю, вам нужна функция, чтобы быть

void compare(char array[][161], int entries, char compare[], char whole[])

поскольку вы не передаете массив указателей на символы, вы передаете двумерный массив символов. C должен знать внутренний размер двумерных массивов, чтобы правильно выполнять индексацию. Подробнее см. В этой статье

Альтернативой размеру жесткого кодирования было бы добавить что-то вроде этого перед вызовом функции:

char* stringPtrs[N_STRINGS];
for (i=0;i<N_STRINGS;i++) { stringPtrs[i]=strings[i]; }
compare(stringPtrs, entries, ...);
0 голосов
/ 02 декабря 2011

Я бы просто использовал двойной указатель (указатель на указатель).На самом деле я бы просто использовал указатели вместо массивов.В конце концов, все они сводятся к одному и тому же.

void compare(char **array, int entries, char *compare, char *whole) {

Я не думаю, что какое-либо тело нужно изменить.ошибка сегментации, которую вы видите в своем коде, вероятно, происходит из-за недостатка памяти.Если вы используете malloc для выделения, используйте realloc, чтобы выделить достаточно места для объединения строк.Если вы используете стековое хранилище, выделите достаточно места для каждого элемента массива, если вам необходимо выполнить конкатенацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...