[C] Come suddividere una stringa in coppie di caratteri

di il
24 risposte

24 Risposte - Pagina 2

  • Re: [C] Come suddividere una stringa in coppie di caratteri

    @Luca ... si è capito cosa vuoi ottenere ... ora prova con un vettore statico grande a sufficienza per l'output e prova a scrivere il codice con il suggerimento dato, ovvero abbandona il tuo tentativo iniziale e scorri la stringa iniziale per formare quella finale.
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    Andrea Quaglia ha scritto:


    Il modo più semplice è fare il contrario di come hai fatto per togliere gli spazi. Ovvero un ciclo con all'interno un contatore che azzeri ogni volta che arrivi a 2; quando arrivi a 2 metti lo spazio e prosegui con gli altri caratteri.
    Per gli altri problemi del codice che hai scritto ne parliamo dopo...

    Che intendi per "ogni volta che arrivi a 2"?
    Ho provato a fare in questo modo, ma mi divide solamente le due parole
    
        for (i=0; i<n; i++)
        {
            if (mess[i] != 2) //credo che sia qui il problema, non credo abbia molto senso hahah
            {
                mess[c2]=mess[i];
                mess[c2]==' ';
                c2++;
                printf("%c", mess[i]);
            }
        }
    
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    No quella if non ha senso. Riprova
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    oregon ha scritto:


    No quella if non ha senso. Riprova
    E che intendi per arrivare a 2?
    Devo controllare se è pari? Quindi facendo i%2==0?
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    Vuol dire che leggi la stringa di partenza, aggiungi un carattere alla nuova stringa solo se diverso da ' ', conti ogni carattere aggiunto e quando il conteggio arriva a due aggiungi lo spazio e ricominci il conteggio da zero... e dai un po' di iniziativa, se ti blocchi su ste cose a difficoltà bassissima poi che fai quando le cose si complicano?
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    Lucabarba ha scritto:


    oregon ha scritto:


    No quella if non ha senso. Riprova
    E che intendi per arrivare a 2?
    Non sono stato io a dirtelo ma Andrea. Fai attenzione a chi ti risponde nel forum.

    [quorum]
    Devo controllare se è pari? Quindi facendo i%2==0?
    [/quote]

    No.

    E' un compito molto semplice, come ti hanno detto ma sembra che tu sia molto molto confuso.

    Ti chiedo, sapresti partire da un codice semplice che copia tutti i caratteri da una stringa all'altra? Così semplicemente tutti senza eccezioni.
    Conosci i cicli? Prova....
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    Nippolo ha scritto:


    Intendevo che nel caso dinamico l'intestazione diventa (volendo restare nell'ambito di una procedura con un solo argomento):
    void fun(char **str)
    me lo spieghi, per cortesia, perché non riesco a capire

    o meglio, ho capito una cosa: passi un puntatore a puntatore a carattere come per passare un array di stringhe, il primo elemento sarà l'input
    il secondo l'output

    ho capito giusto?
    e se sì, perché? mi sembra inutile complicazione
    [EDIT]
    Forse ho capito
    passi il puntatore(a) al puntatore(b) a carattere
    per poter modificare il puntatore(b) e quindi "restituire" una stringa differente, ma indirettamente: cambiando il parametro, non con una return esplicita

    ma la mia domanda di tre righe avanti rimane: perchè? non è più facile "restituire" piuttosto che modificare i parametri passati?
    [/EDIT]

    quindi domanda è: dove sbaglio?

    io banalmente, e senza pubblicare codice risolutivo avevo fatto una cosa del genere
    int main()
    {
       char input[] = "ciao, mi chiamo luca e vorrei presentarmi a voi";
       char * output = separa(input);
    
       // qui ci sarebbe da fare un controllo sul puntatore restituito....
       if(output)
       {
          printf("%s\n", input);
          printf("%s\n", output);
          free(output);
          return 0;
       }
    
       else
       {
          printf("Errore di allocazione memoria\n");
          return 1;
       }
    }
    l'inizio della funzione separa è:
    char * separa(char * input)
    {
       char * output = (char *) calloc(sizeof(char), strlen(input) * 3 / 2) ; // al massimo uno spazio ogni due caratteri
    
    che funziona identica identica (provato) anche se per la prima stringa uso l'allocazione dinamica
    int main()
    {
       char input[] = "ciao, mi chiamo luca e vorrei presentarmi a voi";
       char * secondo;
       secondo=(char *) calloc(sizeof(char),strlen(input));
       strcpy(secondo, input);
       char * output = separa(secondo);
    
       // qui ci sarebbe da fare un controllo sul puntatore restituito....
       if(output)
       {
          printf("%s\n", secondo);
          printf("%s\n", output);
          free(output);
          return 0;
       }
    quindi non vedo quali differenz dovrebbero esserci tra passare un array statico o uno dinamico
    dove sbaglio?
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    char * output = (char *) calloc(sizeof(char), strlen(input) * 3 / 2) ; // al massimo uno spazio ogni due caratteri
    Il caso "peggiore" dovrebbe essere quello di una stringa senza spazi, quindi (contando anche il carattere terminatore di stringa) una lunghezza sufficiente è data da:
    strlen(input) + strlen(input) / 2 + strlen(input) % 2
    Per esempio le stringhe "abcdefgh" e "abcdefg" necessitano rispettivamente di un array di caratteri di dimensione 12 e 11. Con la tua formula però in caso di stringa dispari allochi un carattere in meno rispetto a quelli potenzialmente necessari.
    P.S.
    Non dovrebbero essere invertiti i due argomenti della calloc()?
       char * secondo;
       secondo=(char *) calloc(sizeof(char),strlen(input));
       strcpy(secondo, input);
    Non dovrebbe essere?
    strlen(input) + 1
    me lo spieghi, per cortesia, perché non riesco a capire

    o meglio, ho capito una cosa: passi un puntatore a puntatore a carattere come per passare un array di stringhe, il primo elemento sarà l'input
    il secondo l'output

    ho capito giusto?
    No, intendevo qualcosa del genere:
    void fun(char **str)
    {
        unsigned int i = strlen(*str);
        char *temp = *str;
        *str = (char*)malloc((i + i / 2 + i % 2) * sizeof(char));
        ...
    }
    
    int main()
    {
        char *str = "ciao mondo";
        printf("%s\n", str);
        fun(&str);
        printf("%s", str);
        return 0;
    }
    Il puntatore doppio è necessario affinché le modifiche apportate da fun() a str siano conservate al ritorno nel main.
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    ma la mia domanda di tre righe avanti rimane: perchè? non è più facile "restituire" piuttosto che modificare i parametri passati?
    Beh per quanto riguarda la questione facile/difficile è relativo, in ogni caso l'OP parlava di procedura.
  • Re: [C] Come suddividere una stringa in coppie di caratteri

    Ok, adesso tutto chiaro
    Grazie
Devi accedere o registrarti per scrivere nel forum
24 risposte