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

Ho questo problema con la funzione "strtok"
(non lo so nemmeno io perchè mi ci sono così incaponito, comunque...)
Questo è il mio codice:
void trigonometric::trig_calc(char *dat)
{ 
char *deg, *min, *sec;
cout << "Questo lo stampa!!!" << endl;
// questa riga viene stampata
deg=strtok(dat,"d");
// in questa prima chiamata a strtok c'è l' errore! infatti la riga sottostante non me la stampa!
// ho fatto anche il debug riga x riga ma sinceramente quando il debugger passa alla funzione
//   non c'ho capito una mazza e invece che aiutarmi mi incasina
cout << "Questo non lo stampa!<< endl;
min=strtok(0,"m");  
sec=strtok(0,"s");
angle=atof(deg)+((atof(min))/60.0)+((atof(sec))/360.0);
answer_sine=sin(angle * DEG_TO_RAD);
answer_cosine=cos(angle * DEG_TO_RAD);
answer_tangent=tan(angle * DEG_TO_RAD);
cout << "\nAngolo: " << angle
  << " gradi." << endl;
cout << "Seno: " << answer_sine << endl;
cout << "Coseno: " << answer_cosine << endl;
cout << "Tangente: " << answer_tangent << endl;
}
int main()
{
trigonometric data;
data.trig_calc("35d 75m 20s");
return(0);
}
********************
Questo l'ho preso da MSDN e giustamente l'esempio funziona!!!! (peccato sia in inglese)
On the first call to strtok, the function skips leading delimiters and returns a pointer 
to the first token in strToken, terminating the token with a null character. More tokens 
can be broken out of the remainder of strToken by a series of calls to strtok. Each call 
to strtok modifies strToken by inserting a null character after the token returned by that 
call. To read the next token from strToken, call strtok with a NULL value for the strToken 
argument. The NULL strToken argument causes strtok to search for the next token in the 
modified strToken. The strDelimit argument can take any value from one call to the next 
so that the set of delimiters may vary.
Warning   Each of these functions uses a static variable for parsing the string into tokens.
 If multiple or simultaneous calls ar
e made to the same function, a high potential for data
corruption and inaccurate results exists. Therefore, do not attempt to call
the same function
simultaneously for different strings and be aware of calling one of these
function from within
a loop where another routine may be called that uses the same function.
However, calling
this function simultaneously from multiple threads does not have undesirable
effects.
Example
/* STRTOK.C: In this program, a loop uses strtok
 * to print all the tokens (separated by commas
 * or blanks) in the string named "string".
 */
#include <string.h>
#include <stdio.h>
char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;
void main( void )
{
   printf( "%s\n\nTokens:\n", string );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}
Output
A string   of ,,tokens
and some  more tokens
Tokens:
 A
 string
 of
 tokens
 and
 some
 more
 tokens
***************
a rileggere tutto mi sembra di essere stato esageratamente lungo, ma magari
se uno la funzione la sa già.....
Grazie anticipatamente.

una correzione dovuta:
nel libro da cui ho preso il codice la chiamata alla funzione in realtà e
così:
main()
.....
data.trig_calc("35<ERRORE: Carattere speciale sconosciuto cancellato> 75m
20s");
...
inutile dire che ho provato anche così ma non funziona;
ma poi che cavolo vuol dire quella stringa???
a me sembrerebbe più logico chiamarla così:
data.trig_calc("35d 75m 20s")    O NO?

char string[]="35d 75m 20s";
data.trig_calc(45.0);
data.trig_calc(string);
così funziona, peccato che c'ho messo quasi 2 ore per capirlo!
(bello no? ho postato e poi mi sono autorisposto, ma si può essere
più scemi)