Domanda

Ho bisogno di una matrice multidimensionale di caratteri dinamica in una sola dimensione ...
Devo memorizzare una coppia di stringhe con una lunghezza di 10 (o meno) caratteri ciascuna, ma con un numero variabile di "coppie".

La mia idea era questa

char (*instrucao)[2][10];

Il che mi dà un puntatore a un array di caratteri 2x10, ma questo non funziona correttamente quando faccio qualcosa del genere:

char strInstrucoes[117], *conjunto = calloc(21, sizeof(char));
instrucao = calloc(1, sizeof(char[2][10]));
conjunto = strtok(strInstrucoes,"() ");
for(i = 0; conjunto != NULL; i++){
    realloc(instrucao, i+1*sizeof(char[2][10]));
    sscanf(conjunto,"%[^,],%s", instrucao[i][0], instrucao[i][1]);
    printf("%s | %s\n", instrucao[i][0], instrucao[i][1]);
    conjunto = strtok(NULL, "() ");
}

Avendo strInstrucoes come (abc, 123) (def, 456) (ghi, 789) , non ho una matrice con 3 linee di 2 coppie ciascuna come questa :

abc | 123
def | 456
ghi | 789

ma invece è quello che sto ottenendo:

abc | 123
def | 45def | 45de
ghi | 789

Qual è il modo giusto per farlo? Grazie!

È stato utile?

Soluzione

Dovresti assegnare al puntatore il nuovo indirizzo realloc restituisce

instrucao = realloc(instrucao, (i+1)*sizeof(char[2][10]));

Tieni presente che per il controllo degli errori, potresti voler assegnare un nuovo puntatore e controllare NULL . Nota anche le parentesi: in pratica hai appena aggiunto i invece di moltiplicare per la dimensione richiesta. Facilmente supervisionato.

Nota che non è necessario il calloc iniziale. Basta inizializzare instrucao su NULL e realloc si comporterà come malloc quando passa per la prima volta un puntatore null.

Altri suggerimenti

Faresti molto meglio a trovare una libreria con un contenitore che soddisfi le tue esigenze. Nel peggiore dei casi, utilizzando nessuna delle librerie molto migliori, potresti avere due array separati, ognuno dei quali contiene metà della coppia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top