Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    [C] Stringhe e separatori

    Ciao a tutti,
    io dovrei creare una stringa con dei separatori di tipo \0 all'interno per separare appunto i token, ho fatto cosi' ma pare non funzionare...

    codice:
    char *prima = "prima";
    char *seconda = "seconda";
    char *completa =(char*)malloc( strlen(prima) + strlen(seconda) * sizeof(char) );
    
    strcpy( completa, prima );
    strcat( completa, "\0" );
    strcat( completa, seconda );
    qualcuno sa aiutarmi?

    Magari anche con qualcosa di piu elegante..hehe :-)

    grazie!
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Non può funzionare perchè, da quello che ricordo, la strcat() concatena una null terminated string con una seconda stringa. Quindi, aggiungere un carattere NULL alla fine della prima stringa è inutile, poichè la strcat si ferma appunto al primo che trova.

    Attenzione all'allocazione della stringa "completa": devi prevedere un carattere in più per il terminatore di stringa... più anche un altro dato che ne vuoi aggiugnere uno tu in mezzo!

    Io lavorerei con l'aritmetica dei puntatori. O passi alla strcat un puntatore alla nuova posizione della stringa "completa" oppure la implementi tu, copiando carattere per carattere.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Aggiungo anche questo: attento all'utilizzo degli operatori. Il modo in cui hai allocato la stringa "completa" non è del tutto corretto (o almeno non lo è in generale):
    codice:
    char *completa =(char*)malloc( strlen(prima) + strlen(seconda) * sizeof(char) );
    
    equivale a questo
    
    char *completa =(char*)malloc( strlen(prima) + (strlen(seconda) * sizeof(char)) );
    per cui, dovresti utilizzare le parentesi:
    codice:
    char *completa =(char*)malloc( (strlen(prima) + strlen(seconda)) * sizeof(char) );
    inoltre, come detto prima, devi aggiungere lo spazio per i due caratteri NULL:
    codice:
    char *completa =(char*)malloc( (strlen(prima) + strlen(seconda) + 2) * sizeof(char) );
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    ho provato a fare cosi', ma nn va ugualmente:

    codice:
    strcpy( completa, prima );
    completa[ strlen(completa) ] ='\0';
    strcat( completa, seconda );
    in questo modo io aggiungo il \0 "a forza" e poi concateno... ma nn va
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  5. #5
    Originariamente inviato da Poker1
    ho provato a fare cosi', ma nn va ugualmente:

    codice:
    strcpy( completa, prima );
    completa[ strlen(completa) ] ='\0';
    strcat( completa, seconda );
    in questo modo io aggiungo il \0 "a forza" e poi concateno... ma nn va
    codice:
    strcpy( completa, prima );
    completa[ strlen(completa) ] =' ';
    completa[ strlen(completa)+1 ] ='\0';
    strcat( completa, seconda );
    completa[ strlen(completa) ] ='\0';

  6. #6
    Utente di HTML.it L'avatar di GabbOne
    Registrato dal
    Mar 2006
    Messaggi
    577
    Devi fare tutto a mano perche la strcat te lo toglie il tappo('\0') quando concatena e te lo mette alla fine forse puoi provare con questo
    L'allocaziona e come quella di LeleFT
    for (i=0;i<strlen(prima);i++)
    {
    completa[i]=prima[i];
    }
    completa[i]='\0';
    i++;
    for(j=0;i<strlen(prima)+strlen[seconda];i++)
    {
    completa[i]=seconda[j];
    }
    completa[i]='\0';

    sinceramente non lo provato ma compilandolo a mano sembra che funzioni
    Se usi questa tattica tutte le funzioni per la gestione delle stringa vanno a farsi benedire
    ciaooo

  7. #7
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    Me ne sto rendendo conto, purtroppo il progetto che devo fare vuole cosi' ( almeno da quel che ho capito io, e spero fortemente di sbagliarmi!!!! ).

    Ho fatto un'altra implementazione simile a quella che mi hai mandato tu, ma e' praticamente impossibile la gestione poi, anche la strtok impazzisce con questi delimitatori..e' veramente un casino gestire stringhe cosi'.
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.