Split di un char* e asseganzione ad un array

di il
9 risposte

Split di un char* e asseganzione ad un array

Ciao a tutti premetto che non sono un programmatore ma mi diletto un po in python e per un progetto personale ho iniziato a studiare anche il C, una cosa semplicissima da fare in python (dividere una stringa per mezzo di un separatore e assegnare le varie sottostringhe ad un array) non è altrettanto semplice in C, ho letto di strtok, che però distrugge la stringa originale, quindi vorrei evitarlo, il mio scopo sarebbe questo:
splittare la stringa che mi arriva in questo formato "xxx/yyy/zzz", non so a priori in quante sottostringhe dovrò dividerla, quindi dividerla per il separatore "/" assegnare ogni sottostringa ad un indice di un array, logicamente nell'ordine in cui è scritta la stringa originale, cambiare una sottostringa e poi ricomporre la stringa con la sottostringa cambiata e quindi ritornarla al programma.

Grazie

9 Risposte

  • Re: Split di un char* e asseganzione ad un array

    Ovviamente il C è un linguaggio diverso dal Python (magari lo stesso Python è scritto in C) e quello che si fa è più lontano dall'essere umano ma più vicino alla macchina.

    Se hai una stringa e devi cambiarne solo una parte, potrebbe essere conveniente individuare questa parte senza suddividerla nei vari pezzi.
    Ci dici esattamente (e realmente) come è fatta la stringa in ingresso e come deve diventare in uscita?
  • Re: Split di un char* e asseganzione ad un array

    Ok la stringa arriva da un brocker mqtt, quindi non sarà sempre la stessa, in alcuni casi potrà essere 'light/on_off/light_1/set' in altri casi qualcosa di diverso, il mio scopo è quello di sostituire l'ultimo pezzo cioè 'set' in status, in quanto dopo aver fatto quello che deve fare la funzione deve reinviare al brocher il risultato ma nel topic dello stato, ecco perchè devo modificare set con status, avevo pensato di splittare la stringa perchè ho simulato il programma in python e ho fatto così, ma se in C c'è un modo migliore per me non ci sono problemi.

    Grazie
  • Re: Split di un char* e asseganzione ad un array

    Ma alla fine è sempre set e deve cambiare sempre in status ?
  • Re: Split di un char* e asseganzione ad un array

    Si cambia il topic ma le ultime sono sempre set e status, e la stringa in uscita deve restare invariata tranne che per set e status.
  • Re: Split di un char* e asseganzione ad un array

    Dato che sono poche linee ... anche se normalmente il codice pronto non è consentito ...
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *change(const char *s)
    {
    	char *rs = strdup(s);
    	int ls = strlen(s);
    
    	rs = (char *)realloc(rs, ls + 4);
    	strncpy(rs + ls - 3, "status\0", 7);
    
    	return rs;
    }
    
    int main()
    {
    	char s[] = "123/456/789/set";
    
    	printf("%s\n", s);
    
    	char *res = change(s);
    	printf("%s\n", res);
    	free(res);
    
            return 0;
    }
    
  • Re: Split di un char* e asseganzione ad un array

    Hai riallocato la memoria per la differenza tra set è status giusto?
    poi in main dopo aver fatto il tutto liberi la memoria allocata con free?

    ti ringrazio la provo
  • Re: Split di un char* e asseganzione ad un array

    Scusa se approfitto della tua conoscenza, sto provando strcpy e ho come stringa un char* strcpy non va ma se invece la stringa la creo come array va tutto a buon fine.

    char* str = "blablabla" strcpy(str, "test") mi da errore
    mentre charstr[] = "blablabla" strcpy(str, "test") tutto ok

    E' una cosa normale o sbaglio io qualcosa?

    Grazie
  • Re: Split di un char* e asseganzione ad un array

    Certo ...

    Nel primo caso hai solamente il puntatore e la stringa è memorizzata come costante (quindi non la puoi cambiare con la strcpy).

    Nel secondo, viene creato un array di char in memoria e copiata la stringa dentro. In seguito potrai usare la strcpy per modificarla.

    Ma non c'entra con il problema di prima, di cui non hai detto nulla. Come è finita?
  • Re: Split di un char* e asseganzione ad un array

    No non c'entra la tua funzione funziona benissimo
    Grazie
Devi accedere o registrarti per scrivere nel forum
9 risposte