Questa è più una domanda concettuale a questo punto piuttosto che una pratica, ma mi dà davvero fastidio.Trovare la dimensione di una stringa in argv usando sizeof
Diciamo che ho un programma c chiamato "test.c" e voglio trovare il numero di spazi in array ci sono per una parola che l'utente digita come argomento. Ad esempio "./test.c test_run" dovrebbe stampare 9 perché ci sono 8 caratteri e quindi uno per il carattere di terminazione null. Quando cerco di usare sizeof su argv, ho qualche problema.
int main(int argc, char *argv[]) {
char buf10[10];
printf("The size of buf10 is: %i.\n", sizeof(buf10));
return 0;
}
stampa il risultato: "La dimensione buf10 è: 10.". Questo ha senso perché ho scelto un array di caratteri. In C, la dimensione di un carattere è 1 byte. Se ho scelto int, questo numero sarebbe 4.
Ora la mia domanda è perché non posso farlo con argv?
int main(int argc, char *argv[]) {
printf("argv[1] has the value: %s\n", argv[1]);
printf("strlen of argv[1] is: %i\n", strlen(argv[1]));
printf("sizeof of argv[1] is: %i\n", sizeof(argv[1]));
return 0;
}
Ran con "./test Hello_SO" dà l'output:
argv[1] has the value: Hello_SO
strlen of argv[1] is: 8
sizeof of argv[1] is: 4
La lunghezza della stringa senso perché esso deve essere 9 ma meno il "\ 0" rende 8.
Tuttavia non capisco perché sizeof restituisca 4 (la dimensione del puntatore). Capisco che * argv [] può essere pensato come ** argv. Ma ne ho già tenuto conto. Nel mio primo esempio stampo "buf" ma qui stampo "argv [1]". So che potrei ottenere facilmente la risposta usando strlen ma come ho detto prima questo è solo concettuale a questo punto.
Sembra che tu abbia forse risposto alla tua stessa domanda. – alex
'argv [1]' ha tipo 'char *', quindi 'sizeof argv [1]' significa 'sizeof (char *)'. Questo è ciò che fa sizeof. –
Ma perché buf10 print 10 e argv [1] non stampano 9. buf10 è anche un puntatore vero? –