[C] Puntatori
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...
Grazie in anticipo!
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
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:
In pratica
equivale a qualcosa del genere
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); }
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!!!
Ora è tutto chiaro, grazie mille!!!