Если ваш синтаксический анализ строки производит некоторые динамически размещенные строки, то вы можете просто скопировать его в массив истории в конце цикла.
На следующем проходе цикла у вас есть доступ как к новым значениям в 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
.