Dieses ist eher eine begriffliche Frage an diesem Punkt eher als eine praktische aber es stört mich wirklich.Finden der Größe einer Zeichenkette in argv using sizeof
Lassen Sie uns sagen, ich habe ein c-Programm namens "test.c" und ich möchte die Anzahl der Leerzeichen in Array gibt es für ein Wort, das der Benutzer als ein Argument eingibt. Zum Beispiel sollte "./test.c test_run" 9 drucken, da es 8 Zeichen und dann eins für das nullende Zeichen gibt. Wenn ich versuche, sizeof auf argv zu verwenden, habe ich einige Probleme.
int main(int argc, char *argv[]) {
char buf10[10];
printf("The size of buf10 is: %i.\n", sizeof(buf10));
return 0;
}
das Ergebnis Druckt: "Die Größe buf10 ist: 10.". Das macht Sinn, weil ich ein Char-Array gewählt habe. In C ist die Größe eines Zeichens 1 Byte. Wenn ich int wählen würde, wäre diese Zahl 4.
Jetzt ist meine Frage, warum kann ich das nicht mit Argv tun?
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 mit "./test Hello_SO" gibt die Ausgabe:
argv[1] has the value: Hello_SO
strlen of argv[1] is: 8
sizeof of argv[1] is: 4
Die Stringlänge macht Sinn, weil es 9 sein sollte, aber minus der "\ 0" macht 8.
Allerdings verstehe ich nicht, warum sizeof 4 (die Größe des Zeigers) zurückgibt. Ich verstehe, dass * argv [] als ** argv gedacht werden kann. Aber ich habe dies bereits berücksichtigt. In meinem ersten Beispiel drucke ich "buf", aber hier drucke ich "argv [1]". Ich weiß, ich könnte leicht die Antwort bekommen, indem ich strlen benutze, aber wie ich schon sagte, das ist an dieser Stelle nur konzeptionell.
Klingt, als ob Sie vielleicht Ihre eigene Frage beantwortet haben. – alex
'argv [1]' hat den Typ 'char *', also bedeutet 'sizeof argv [1]' 'sizeof (char *)'. Das ist, was Größe macht. –
Aber warum druckt buf10 10 und argv [1] nicht 9. buf10 ist auch ein Zeiger, ist es nicht? –