grazie 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?
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";
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).
>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;
}
>[...]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.
> 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 '
>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()
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.