Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

dividere stringhe

3 views
Skip to first unread message

Cristiano

unread,
Jul 6, 2008, 3:07:25 PM7/6/08
to
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


Andrea Laforgia

unread,
Jul 6, 2008, 5:16:16 PM7/6/08
to
On Sun, 6 Jul 2008 21:07:25 +0200, "Cristiano"
<magico...@tiscali.it> wrote:

>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?

strtok()

>A lavoro terminato dovrò avere:
>char stringa1="parola1"
>char stringa2="parola2"

Per amor di precisione, questa scrittura non è corretta. In C si
scrive:

char *stringa="aaaa";

oppure

char stringa[]="aaaa";

Roberto Montaruli

unread,
Jul 6, 2008, 5:21:27 PM7/6/08
to
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).

Andrea Laforgia

unread,
Jul 6, 2008, 5:54:20 PM7/6/08
to
On Sun, 06 Jul 2008 23:21:27 +0200, Roberto Montaruli
<rmont...@yahoo.com> wrote:

>Non esiste in C alcuna funzione nella libreria standard che fa quello
>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;
}

Cristiano

unread,
Jul 6, 2008, 6:52:22 PM7/6/08
to
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...

Andrea Laforgia

unread,
Jul 6, 2008, 7:02:17 PM7/6/08
to
On Mon, 7 Jul 2008 00:52:22 +0200, "Cristiano"
<magico...@tiscali.it> wrote:

>[...]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.

Roberto Montaruli

unread,
Jul 7, 2008, 8:31:49 AM7/7/08
to
Andrea Laforgia ha scritto:

> On Sun, 06 Jul 2008 23:21:27 +0200, Roberto Montaruli
> <rmont...@yahoo.com> wrote:

> >Non esiste in C alcuna funzione nella libreria standard che fa quello
> >che dici

> Non è vero, esiste la strtok()/strtok_r() che può essere usata allo
> 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 '

Andrea Laforgia

unread,
Jul 7, 2008, 2:06:57 PM7/7/08
to
On Mon, 07 Jul 2008 14:31:49 +0200, rmont...@yahoo.com (Roberto
Montaruli) wrote:

>Occhio pero' perche' come da manuale, la strtok() distrugge la stringa
>originaria, andando a ficcare degli '

E' per questo che esiste la versione rientrante (che ho anche
suggerito): strtok_r()

Roberto Montaruli

unread,
Jul 7, 2008, 4:33:17 PM7/7/08
to
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?

Andrea Laforgia

unread,
Jul 7, 2008, 5:07:30 PM7/7/08
to
On Mon, 07 Jul 2008 22:33:17 +0200, Roberto Montaruli
<rmont...@yahoo.com> wrote:

>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.

0 new messages