[C] Puntatori

sofisofi3
Ciao a tutti, ho un dubbio su questo codice e in generale faccio confusione sui puntatori..
Strtok è una funzione che restituisce un puntatore e infatti *tokenPtr è un puntatore.
Quando però lo uso all'interno del ciclo while, in quel caso tokenPtr, per come è scritto, indica un indirizzo?
Dal poco che ho capito sui puntatori dovrebbe appunto essere un indirizzo, perchè il valore di una variabile puntatore è l'indirizzo dell'elemento a cui punta, però questo non mi torna, nel momento in cui tokenPtr è usato in printf e vengono stampate delle parole, non degli indirizzi...

#include <stdio.h>
#include <string.h>

int main(void)
{ 
   char string[] = "This is a sentence with 7 tokens";
   
   printf("%s\n%s\n\n%s\n",
      "The string to be tokenized is:", string, 
      "The tokens are:");
      
   char *tokenPtr = strtok(string, " "); 

   while (tokenPtr != NULL) { 
      printf("%s\n", tokenPtr);
      tokenPtr = strtok(NULL, " "); // get next token
   } 
} 


Grazie in anticipo!

Risposte
utente__medio11
Ciao, ma il problema è strtok() o il funzionamento di printf() in relazione alle stringhe?

Relativamente a quest'ultimo caso, va detto che il comportamento della funzione printf() varia a seconda dello specificatore di formato. Considerando un puntatore di tipo [inline]char[/inline]:
- se utilizzi lo specificatore [inline]%p[/inline], andrai a stampare l'indirizzo contenuto nel puntatore;
- se utilizzi lo specificatore [inline]%s[/inline], la funzione andrà a considerare e stamperà la stringa che parte dalla locazione di memoria contenuta nel puntatore.

Per esempio:
#include <stdio.h>

int main()
{
    char *ptr = "uno due e tre!";
    printf("INDIRIZZO DI MEMORIA: %p\n", ptr);
    printf("CONTENUTO STRINGA: %s\n", ptr);
    return 0;
}



In pratica

printf("%s", ptr);


equivale a qualcosa del genere

for(char *p = ptr; *p != '\0'; ++p)
{
    printf("%c", *p);
}

sofisofi3
Sì il problema effettivamente era in printf, non avevo fatto caso agli specificatori e quindi non capivo perchè stampasse una cosa piuttosto che un'altra.
Ora è tutto chiaro, grazie mille!!!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.