Newsgroup: it.comp.lang.c++
Titolo: strtok

Salve a tutti
Ho scritto questo piccolo programma:
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char string[] = " Ciao come stai? ";
    char lettera;
    cin >> lettera;
    char parola[10];
    cin >> parola;
    char *tokenptr;
    tokenptr = strtok ( string, *lettera );
    while ( tokenptr = NULL ) {
          cout << tokenptr << parola;
          tokenptr = strtok ( NULL, parola ); }
      system("PAUSE");
      return 0;
}
dovrebbe prendere in input una lettera ed una parola, e stampare la frase e
la parola al posto di quella lettera.
esempio
ciao come stai?
se inserisco la c a ok dovrebbe stampare
okiao okome stai?
Ma non funziona....nessuno potrebbe dirmi il motivo?
Grazie, Freddy

 Ho scritto questo piccolo programma:
...è uno strano ibrido tra C e C++
Facendo tutto in C++ un modo e' questo:
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
    std::string stringa = " ciao come stai? ";
    char lettera;
    std::string parola;
    std::cin >> lettera;
    std::cin >> parola;
    for(std::string::size_type i = 0; i < stringa.size(); ++i)
    {
        if(stringa[i] == lettera)
        {
            stringa.replace(i, 1,parola);
        }
    }
    std::cout << stringa;
}
Occhio che distingue tra lettere maiuscole e minuscole.
Per quel che riguarda il tuo codice, invece, credo che strtok non
sia adeguata a quello che vuoi fare.
Probabilmente è meglio
char * strchr(const char*; char*)
ma sul C e' meglio se mi astengo...
--
Gerolamo

    std::string parola;
Includere <algorithm> non ha senso , visto che non li usi.
Il Ghenio
---------
// TODO: Place your ass here

 Includere <algorithm> non ha senso , visto che non li usi.
Hai ragione, mi era rimasto scritto da un'altra versione
del codice... W il cut&paste!
Ne approfitto per dire a freddy che il mio codice ha un problema
nel caso la parola contenga la lettera.
Mi spiego. Se cerco di sostituire tutte le 'o' con la parola "topo"
il codice va in loop perche' continua a inserire 'o' che dopo ritrova
risostituendole e così via.
Una versione senza questo problema è:
#include <iostream>
#include <string>
int main()
{
    std::string stringa = " ciao come stai? ";
    char lettera;
    std::string parola;
    std::cin >> lettera;
    std::cin >> parola;
    for(std::string::size_type i = 0;i < stringa.size();)
    {
        if(stringa[i] == lettera)
        {
            stringa.replace(i, 1,parola);
            i+=parola.size();
        }
        else ++i;
    }
    std::cout << stringa;
}


stringa.replace....ma io non ho studiato ancora tutte queste funzioni
Freddy

 stringa.replace....ma io non ho studiato ancora tutte queste funzioni
beh... io te lo avevo detto che era molto C e poco C++ il tuo :-)))
Ti consiglio di prendere un buon libro sulla libreria standard del C++
Scoprirai che certe volte reinventare l'acqua calda è inutile...
Prova a vedere sulle FAQ ( 
http://cpp.programmazione.it
 ) i libri
consigliati.
Personalmente ti consiglio quello di Stroustrup, quello di Lippman
o quello di Bruce Eckel (che puoi scaricare dal suo sito.)
ciao
--
Gerolamo

stringa.replace....ma io non ho studiato ancora tutte queste funzioni
Allora un buon libro é quello che fa per te, l'uso di tali
funzionalità per chi utilizza il c++ é all'ordine del giorno e
l'utilizzo di funzioni della libreria del c , peraltro alcune delle
quali di dubbio gusto e dal funzionamento non garantito( mi pare che
strtok modifichi addirittura la stringa passata per argomento)é
decisamente sconsigliato.
Gestire le stringhe tramite array di caratteri peraltro, a dispetto di
ciò che pensa qualcuno, può addirittura penalizzare le prestazioni ed
in alcuni casi le classi std::string della libreria standard sono
notevolmente più efficienti( dal punto di vista delle prestazioni),
oltre che ad essere molto più alla mano.


 ciň che pensa qualcuno, puň addirittura penalizzare le prestazioni ed
A volte si`.  Il caso peggiore e` qualcosa come:
    char hugebuffer[HUGE] = "";
    for(int i=0; i<N; ++i)
        strcat(hugebuffer, smallpiece[i]);
Questo richiede un tempo O(N*N) per mettere assieme una grossa
stringa da N stringhe piccoline -- un disastro.  Ovviamente si puo`
fare di meglio anche con stringhe-come-array, ma non usando le
disastrose funzioni str... dello standard C, che oziosamente tornano
l'indirizzo *iniziale* della stringa (che uno tipicamente gia` aveva) e
non quello variabile *finale* (che potrebbe far comodo).
Non conosco simili clamorosi "trabocchetti di prestazioni" nella
std::string (una data implementazione forse puo` averne, ma non
vi sono difetti paragonabili nell'architettura complessiva, cioe`
operazioni dall'aspetto naturale che funzionano si` ma solo con
prestazioni da tragedia).
Alex

prestazioni da tragedia).
Qualsiasi strumento se mal usato può portare prestazioni terribili, ma
io resto dell'opinione che se si usa il c++ non c'é alcun motivo per
non usare std::string, anche perché é perfettamente integrata con i
template e gli algoritmi generici.


disastrose funzioni str... dello standard C, che oziosamente tornano
e perché dovresti usare tali funzioni *se sai che vengono chiamate
ogni volta* e non conviene; usa qualcosa di simile a
char * j;
   for(int i=0; i<N; ++i)
     for(j=smallpiece[i]; (j< buffer+sizeof buffer) && *j!='\0'; j++)
       *buffer++=*j;
 *buffer='\0';
no?

 ogni volta* e non conviene; usa qualcosa di simile a
Ovviamente, NON dovresti usare le funzioni standard C (incluse dunque
anche nello standard C++) strcat e soci (in quasi nessun caso: se non
sono problemi di prestazioni sono problemi di rischi di buffer overflow, 
vedi le funzioni purtroppo non standard strlcat e soci).  Quindi, e` un
grave difetto del linguaggio includere nelle sue librerie standard delle
funzioni che e` quasi sempre meglio non usare.
std::string non e` certo perfetta, ma e` libera da difetti cosi` atroci.  
Purtroppo il C++, volendo includere "quasi un sovrainsieme" del C, ha 
ereditato (assieme a tante cose che, per l'ambito d'uso del C, sono ben
progettate) anche "bubboni" come questi. Ma appunto e` importante in
un newsgroup letto anche da principianti del C++ spiegare quali parti
dello standard e` meglio non usare e perche` (e con cosa sostituirle: in
questo caso, std::string).
Alex