Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - strtok_r
Forum - C/C++ - strtok_r

Avatar
edo42 (Member)
Pro


Messaggi: 102
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 20:33
Martedì, 27/04/2010
Ho un problema e spero che voi mi sappiate aiutare.
La funzione citata nel titolo mi toglie tutti gli spazi dalle stringhe!!
Mi sapete spiegare perchè?
io come token metto solo ",".

Grazie in anticipo,
edo42

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6380
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:13
Martedì, 27/04/2010
1) mostra il codice

2) indica i dati con cui operi

3) dicci come evidenzi il problema


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 21:58
Martedì, 27/04/2010
Fai attenzione, strtok divide la stringa che tu passi come argomento, quindi se poi devi riutilizzarla lavora su una copia!!

Ad Esempio:
Codice sorgente - presumibilmente C++

  1. char *pch; //puntatore al pezzo diviso
  2. char originale[100]="questa, stringa, sarà divisa,dove ci sono, le virgole.";
  3. char copia[100];
  4.  
  5. strcpy(copia,originale);     //crea la copia
  6.  
  7. pch=strtok (copia,",");       //dividi la stringa (lavorando sulla copia)
  8. while (pch != NULL){         //finchè non finisce la stringa
  9.  printf("%s\n",pch);         //scrivi il pezzo diviso e vai a capo
  10.  pch = strtok (NULL, ",");  //continua a dividere
  11. }
  12. printf("\n%s\n",originale);    //stampa la stringa iniziale (per vedere se funziona)



l'output sarà:

Codice sorgente - presumibilmente Plain Text

  1. questa
  2. stringa
  3. sarà divisa
  4. dove ci sono
  5. le virgole.
  6.  
  7. questa, stringa, sarà divisa,dove ci sono, le virgole.



spero di aver rsiposto alla tua domanda, altrimenti spiega meglio il tuo problema!

PM Quote
Avatar
edo42 (Member)
Pro


Messaggi: 102
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 17:52
Mercoledì, 28/04/2010
no scusate ho identificato meglio il problema:
è il comando:
fscanf(ITA, "%s", temp);
che mi crea problemi.
non so perchè ma mi legge ogni parola e non tutta la riga, non capisco perchè.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 18:04
Mercoledì, 28/04/2010

a parte che fscanf appartiene all'I/O del C, ma cmq è fatta proprio così.
devi usare getline se vuoi una riga intera con gli spazi.

PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 18:08
Mercoledì, 28/04/2010
è normale, tutte le funzioni scanf (sscanf,fscanf,..) con il parametro %s leggono solo una parola.
ti consiglio di utilizzare fgets, che legge tutto il contenuto di una riga di un dato file, finchè non trova un carattere di nuova linea..
ad esempio potresti fare così:

Codice sorgente - presumibilmente C#

  1. FILE *temp;
  2. char oneline[255];
  3.    
  4. temp=fopen("file.txt","r");
  5. if (temp==NULL) //errore aprendo il file?
  6.   return 0;
  7.  
  8. while (!feof(temp)){  //finchè non finisce lo stream            
  9. fgets(oneline,255,temp);//leggi una riga di lunghezza 255 caratteri dallo stream temp (in questo caso un file) e salvala in oneline (array di char, cioè una stringa)
  10. //.... eccetera eccetera...
  11. //...
  12. }


PM Quote
Avatar
edo42 (Member)
Pro


Messaggi: 102
Iscritto: 30/07/2009

Segnala al moderatore
Postato alle 19:13
Giovedì, 29/04/2010
Perfetto ora funziona tutto con fgets!!
Ancora una cosa anche se ormai non c'entra molto con il tema iniziale...
come faccio a confrontare due puntatori char, per capire se puntano allo stesso testo? posso usare strcmp.

Scusate se a volte mi esprimo un po' male...

PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 20:38
Giovedì, 29/04/2010
se devi solo controllare se puntano allo stesso indirizzo, cioè alla stessa variabile basta fare un semplice if confrontando gli indirizzi a cui puntano, ad esempio:

Codice sorgente - presumibilmente C++

  1. int x1=23;//due variabili
  2. int x2=43;//a cui puntare
  3.  
  4. int *a,*b;//i due puntatori
  5.  
  6. a=&x1;//assegno i puntatori
  7. b=&x2;
  8.  
  9. if (a==b) {}//così confronti se puntano allo stesso indirizzo nella memoria Stack
  10. if (*a==*b) {}//invece così, compari i loro valori



spero di averti aiutato! :)

PM Quote