Newsgroup: it.comp.programmare
Titolo: dividere stringhe

Ciao a tutti,
in linguaggio C ho una stringa di nome RIGA cosi formata "parola1 parola2"
Si insomma una riga formata da 2 stringhe separate fra loro da spazio.
Esiste una funzione che spezzi le due stringhe e le assegni a 2 variabili di 
tipo stringa?
A lavoro terminato dovrò avere:
char stringa1="parola1"
char stringa2="parola2"
grazie a tutti 

char stringa2="parola2"
Per amor di precisione, questa scrittura non è corretta. In C si
scrive:
char *stringa="aaaa";
oppure
char stringa[]="aaaa";

Cristiano ha scritto:

Parliamo di C.
Non esiste in C il tipo stringa.
Esiste il tipo char, che indica un carattere.
Ed esistono gli array di caratteri.
Cio' premesso, questa cosa che hai scritto
 > A lavoro terminato dovrò avere:
 > char stringa1="parola1"
 > char stringa2="parola2"
non ha alcun significato in C, giacche' stai cercando di assegnare ad un 
char un puntatore a char.
Torniamo alla domanda iniziale.
Non esiste in C alcuna funzione nella libreria standard che fa quello 
che dici, ma scrivere una funzioncina che fa quanto richiesto e' di una 
banalita' sorprendente.
Si tratta solo di decidere se devi conservare la stringa originale o 
intendi distruggerla ottenendo in cambio le due stringhe separate, 
altrimenti allochi lo spazio per le due nuove stringhe, individui lo 
spazio, copi il primo pezzo nel primo buffer precedentemente allocato, 
poi copi il secondo pezzo nel secondo buffer precedentemente allocato.
(Ricorda che se allochi, poi dovrai anche disallocare).

che dici
Non è vero, esiste la strtok()/strtok_r() che può essere usata allo
scopo:
#include <stdio.h>
#include <string.h>
int main()
{
    char s[80];
    char *a, *b;
    strcpy(s, "foo bar");
    a = strtok(s, " ");
    b = strtok(0, " ");
    printf("a = %s\n", a);
    printf("b = %s\n", b);
    return 0;
}

Mi scuso per l'imprecisione.
Avete ragione..
Per quanto riguarda i metodi, quello consigliatomi da Andrea mi sembra il 
piu comodo veloce e pratico.
Quindi addopererò il suo, anche se effettivamente si può implementare anche 
a mano senza grosse difficoltà.
Certo comunque che chidere è sempre meglio!
Grazie a tutti!
"Andrea Laforgia" <a.laf...@andrealaforgia.it.invalid> ha scritto nel 
messaggio news:j5f274to4vjkln670...@4ax.com...


[...]si può implementare anche a mano senza grosse difficoltà.
Implementare a mano ciò che è già presente nella libreria standard non
conviene, può portare a gravi inefficienze. Di solito, gli algoritmi
che lavorano su dati contigui come le stringhe sono facilmente
implementabili in assembly ed è quello che fanno gran parte dei
compilatori (il vecchio Turbo C, tanto per fare un esempio).
Diciamo che in generale non conviene reinventare le ruote, col rischio
che riescano quadrate.

 scopo:
Vero! Hai ragione. Avevo dimenticato l'esistenza della strtok().
Non credo di averla mai usata.
Occhio pero' perche' come da manuale, la strtok() distrugge la stringa
originaria, andando a ficcare degli '

originaria, andando a ficcare degli '
E' per questo che esiste la versione rientrante (che ho anche
suggerito): strtok_r()

Andrea Laforgia ha scritto:

Non sono mica sicuro che la versione rientrante risolva il problema 
della conservazione della stringa originaria.
Ho trovato questo esempio in rete a questa pagina
http://www.cs.ucr.edu/~ysong/cs160/lab2/qa.htm
==============================================================
10. How to use strtok_r() function?
A: You can find the format of the function using "man strtok_r" on 
LINUX/UNIX.  The following is a example of strtok_r()
#include <iostream.h>
#include <string.h>
int main()
{
     char message[]="I am testing strtok_r";
     char *s1=message;
     char *savept;
     for(;;)
     {
       char *result=strtok_r(s1," ",&savept);
       s1=savept;
       if(!result)
               break;
       cout<<"found a token:  "<<result<<endl;
       cout<<"s1 :  "<<s1<<endl;
     }
     return 0;
}
The following is the printout result:
$a.out
found a token:  I
s1 : am testing strtok_r
found a token:  am
s1 : testing strtok_r
found a token:  testing
s1 : strtok_r
found a token:  strtok_r
s1 :
==============================================================
e mi pare proprio che la stringa iniziale venga distrutta 
nell'esecuzione, anche se manca un cout di message alla fine del ciclo.
Il manuale dice che viene inserito un NUL in corrispondenza di ogni 
separatore trovato, e quel NUL viene inserito nella stringa originale.
Anche nel caso della strtok_r().
O sbaglio?

O sbaglio?
Non sbagli. In realt� quando ho scritto quel messaggio avevo in mente
la natura thread-safe di strtok_r() rispetto a strtok(). Anche
strtok_r() distrugge la stringa di partenza.