Как сохранить массив строк, чтобы на него можно было ссылаться позже? - PullRequest
0 голосов
/ 29 сентября 2019
   int counter = 0; 
   while(1) {
      char *arr[9];
      // performing string parsing, results will be put into arr
      counter++;
    }

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

Как я могу сохранить содержимое массива, чтобы позже я мог ссылаться на массив в программе, выполняя это: history[counter] // the content should be arr at that point of execution

1 Ответ

0 голосов
/ 29 сентября 2019

Если ваш синтаксический анализ строки производит некоторые динамически размещенные строки, то вы можете просто скопировать его в массив истории в конце цикла.

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

Чтобы иметь возможность иметь автономный пример, вместо реального разбора кода простодинамически создает несколько строк.

В коде это может выглядеть так:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char *some_str(int counter, int index) {
    char *result = malloc(32);
    sprintf(result, "arbitrary %d_%d", counter, index);
    return result;
}

#define NUM 2

int main() {
    char *history[NUM];
    memset(history, '\0', sizeof history);

    int counter = 0;
    while(1) {
        char *arr[NUM];

        //fill arr with some dynamically allocated strings
        for(int i = 0; i < NUM; i++) {
            arr[i] = some_str(counter, i);
        }

        //here you can access both, new arr and history values at the same tme
        for(int i = 0; i < NUM; i++) {
            char *hist =  history[i];
            if(hist == NULL) {
                hist = "none";
            }
            printf("history[%d]='%s' and arr[%d]='%s'\n", i, hist, i, arr[i]);
        }
        printf("\n");

        //free current history if available and copy arr
        for(int i = 0; i < NUM; i++) {
            if(history[i]) {
                free(history[i]);
            }
            history[i] = arr[i];
        }
        if(counter == 3)
            break;
        counter++;
    }

    //finally free remaining dynamically allocated strings
    for(int i = 0; i < NUM; i++) {
        if (history[i]) {
            free(history[i]);
        }
    }
    return 0;
}

Вывод на консоль будет:

history[0]='none' and arr[0]='arbitrary 0_0'
history[1]='none' and arr[1]='arbitrary 0_1'

history[0]='arbitrary 0_0' and arr[0]='arbitrary 1_0'
history[1]='arbitrary 0_1' and arr[1]='arbitrary 1_1'

history[0]='arbitrary 1_0' and arr[0]='arbitrary 2_0'
history[1]='arbitrary 1_1' and arr[1]='arbitrary 2_1'

history[0]='arbitrary 2_0' and arr[0]='arbitrary 3_0'
history[1]='arbitrary 2_1' and arr[1]='arbitrary 3_1'

Если у вас нет динамически распределенных строк, вы можете просто использовать strdup.

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