27/08/18 18:36
comtel
Buonasera a tutti, il mio problema è il seguente, e ci sto un poco sbattendo la testa: Avendo due stringhe, allora si devono trovare le occorrenze della prima stringa nella seconda (ovviamente la seconda è più grande della prima) e le si devono eliminare col minor numero di spostamenti di memoria possibile.
La soluzione che ho pensato è la seguente: in un primo momento trovo tutte le occorrenze nella stringa e salvo le posizione della corrispondenza in un array di interi. Se la stringa da cercare si ripete due volte in modo consecutivo nella stringa allora l'ultima posizione salvata nell'array delle posizioni viene aggiornata, in modo che quando verrà eseguito lo spostamento di memoria per compattare l'array, non dovrà eseguirlo due volte, ma solo una volta per quella specifica area (non so se ho lasciato intendere). Il punto è proprio questo, ho individuato le aree da eliminare, ed ho anche l'array delle posizioni, ma non riesco a compattare l'array eliminando quelle aree specifiche.
Questo è il codice:
La soluzione che ho pensato è la seguente: in un primo momento trovo tutte le occorrenze nella stringa e salvo le posizione della corrispondenza in un array di interi. Se la stringa da cercare si ripete due volte in modo consecutivo nella stringa allora l'ultima posizione salvata nell'array delle posizioni viene aggiornata, in modo che quando verrà eseguito lo spostamento di memoria per compattare l'array, non dovrà eseguirlo due volte, ma solo una volta per quella specifica area (non so se ho lasciato intendere). Il punto è proprio questo, ho individuato le aree da eliminare, ed ho anche l'array delle posizioni, ma non riesco a compattare l'array eliminando quelle aree specifiche.
Questo è il codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> char * string_del(char *, char *); int main(int argc, char *argv[]) { char *string = "acacrsssdstgfdfgdacacddf", *chr = "ac"; string_del(string, chr); } char * string_del(char *string, char *chr) { int fs_pos, sc_pos, i = 0, j = 0, *pos_array; pos_array = (int *)calloc(0, sizeof(int)); for(i = 0; *(string + i) != 'Buonasera a tutti, il mio problema è il seguente, e ci sto un poco sbattendo la testa: Avendo due stringhe, allora si devono trovare le occorrenze della prima stringa nella seconda (ovviamente la seconda è più grande della prima) e le si devono eliminare col minor numero di spostamenti di memoria possibile.
La soluzione che ho pensato è la seguente: in un primo momento trovo tutte le occorrenze nella stringa e salvo le posizione della corrispondenza in un array di interi. Se la stringa da cercare si ripete due volte in modo consecutivo nella stringa allora l'ultima posizione salvata nell'array delle posizioni viene aggiornata, in modo che quando verrà eseguito lo spostamento di memoria per compattare l'array, non dovrà eseguirlo due volte, ma solo una volta per quella specifica area (non so se ho lasciato intendere). Il punto è proprio questo, ho individuato le aree da eliminare, ed ho anche l'array delle posizioni, ma non riesco a compattare l'array eliminando quelle aree specifiche.
Questo è il codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> char * string_del(char *, char *); int main(int argc, char *argv[]) { char *string = "acacrsssdstgfdfgdacacddf", *chr = "ac"; string_del(string, chr); } char * string_del(char *string, char *chr) { int fs_pos, sc_pos, i = 0, j = 0, *pos_array; pos_array = (int *)calloc(0, sizeof(int)); for(i = 0; *(string + i) != '{parsed_message}'; i++) { if(strncmp(string + i, chr, strlen(chr)) == 0) { if((sc_pos + 1) == i) { sc_pos = i + strlen(chr) - 1; *(pos_array + j) = sc_pos; j++; } else { fs_pos = i; sc_pos = i + strlen(chr) - 1; if(realloc(pos_array, (j)*2 + 1) != NULL) { *(pos_array + j) = fs_pos; *(pos_array + j + 1) = sc_pos; j++; } } } } printf("\n"); for(i = 0; i < j; i += 2) { int size = *(pos_array + i + 1) - *(pos_array + i); char dest = *(string + *(pos_array + i)); char src = *(string + *(pos_array + i + 1)); printf("DEST: %c\tSRC: %c\tSIZE: %d\n", dest, src, size); // In questa sezione del codice dovrei eseguire l'eliminazione e lo spostamento degli elementi. } }'; i++) { if(strncmp(string + i, chr, strlen(chr)) == 0) { if((sc_pos + 1) == i) { sc_pos = i + strlen(chr) - 1; *(pos_array + j) = sc_pos; j++; } else { fs_pos = i; sc_pos = i + strlen(chr) - 1; if(realloc(pos_array, (j)*2 + 1) != NULL) { *(pos_array + j) = fs_pos; *(pos_array + j + 1) = sc_pos; j++; } } } } printf("\n"); for(i = 0; i < j; i += 2) { int size = *(pos_array + i + 1) - *(pos_array + i); char dest = *(string + *(pos_array + i)); char src = *(string + *(pos_array + i + 1)); printf("DEST: %c\tSRC: %c\tSIZE: %d\n", dest, src, size); // In questa sezione del codice dovrei eseguire l'eliminazione e lo spostamento degli elementi. } }
aaa