Forum: PC-Programmierung C environment


von Daniel (Gast)


Lesenswert?

Hallo,
1
int main()
2
int main(int argc)
3
int main(int argc, char ** argv)

Diese Varianten gibt es.

Aufrufzeile "progname 1 2 3"

Wie sieht argv nun intern im Speicher aus?

argv     -> "progname"
argv + 1 -> "1"
argv + 2 -> "2"
argv + 3 -> "3"
argv + 4 -> ??? 0 oder keine 0

while((char *msg = argv++))
    std::cout << msg << std::endl;

andererseits, wenn das so wäre, dann bräuchte man argc Zähler nicht.

Ich finde nicht ob C Standard dazu Stellung bezieht.

Gruss

von Karl H. (kbuchegg)


Lesenswert?

Daniel schrieb:
> Wie sieht argv nun intern im Speicher aus?
>
> argv     -> "progname"
> argv + 1 -> "1"
> argv + 2 -> "2"
> argv + 3 -> "3"
> argv + 4 -> ??? 0 oder keine 0

0

>
> while((char *msg = argv++))
>     std::cout << msg << std::endl;
>
> andererseits, wenn das so wäre, dann bräuchte man argc Zähler nicht.

argc ermöglicht dir auch die alternative Form zu benutzen
1
    for( i = 0; i < argc; ++i )
2
      mach_was_mit( argv[i] );

Das ist das eine. Das andere ist, dass dir argc eine schnelle Prüfung 
ermöglicht, ob genug Parameter angegeben wurden, bzw. darauf zu 
reagieren.
1
int main( int argc, char* argv[] )
2
{
3
  if( argc == 1 ) {
4
    printf( "Not enough parameters\n" );
5
    showHelp();
6
    return EXIT_FAILURE;
7
  }
8
9
  ...

von Klaus W. (mfgkw)


Lesenswert?

Meines Wissens gehört argv[4] nicht mehr zum Standard, sondern ist
(wenn es zu 0 gesetzt ist) ein Goodie des Compilers.
Als legalen Weg kenne ich nur, auf argv[0] bis argv[argc-1]
zuzugreifen.

von yalu (Gast)


Lesenswert?

Aus dem Standard:

  5.1.2.2.1 Program startup
  ...
  If they are declared, the parameters to the main function shall obey
  the following constraints:

  — The value of argc shall be nonnegative.

  — argv[argc] shall be a null pointer.
  ...

von Daniel (Gast)


Lesenswert?

— argv[argc] shall be a null pointer.

Danke.
Ich hatte irgendwie einen segfault gehabt. Und jetzt wieder nicht.

Oben hatte ich einen Fehler drin.
So muss es sein.
1
char * msg;
2
while((msg = *argv++))
3
    std::cout << msg << std::endl;

Wenn die 0 vorgeschrieben ist, dann braucht man auf argc gar
nicht zurückzugreifen.

Gruss, Daniel

von Klaus W. (mfgkw)


Lesenswert?

yalu schrieb:
> Aus dem Standard:
>
>   5.1.2.2.1 Program startup
>   ...
>   If they are declared, the parameters to the main function shall obey
>   the following constraints:
>
>   — The value of argc shall be nonnegative.
>
>   — argv[argc] shall be a null pointer.
>   ...

Das ist C99?

Dann stellt sich die Frage, wer von welchem Standard redet.
Das ist halt das schöne an Standards...

von Rolf Magnus (Gast)


Lesenswert?

> Das ist C99?

Ja, war aber schon immer so in C.

> Dann stellt sich die Frage, wer von welchem Standard redet.
> Das ist halt das schöne an Standards...

C99 ist aber kein Standard, sondern eine Norm.
(Im Gegensatz zu C89 übrigens)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Daniel schrieb:
> Hallo,
>
>
1
> int main()
2
> int main(int argc)
3
> int main(int argc, char ** argv)
4
>

Das Environment als dritten Parameter:
1
int main (int argc, char * argv[], char * envp)

Geht aber möglicherweise nur mit GNU-C

Johann

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Variante mit dem Environment-Pointer kennt auch Microsoft.
(VS2008, "echtes" C/C++)

von Klaus W. (mfgkw)


Lesenswert?

In der DOS-Welt zumindest gibt es die env-Geschichte schon lange,
ich kann mich noch dunkel an Turbo-C++ 1.01 erinnern von 1990.

Im damaligen ANSI-C war es aber m.W. nicht vorgesehen, also
nicht portabel.

von ... .. (docean) Benutzerseite


Lesenswert?

>— argv[argc] shall be a null pointer.

Man beachte das "shall" -> Weiche Anforderung. muß nicht erfüllt werden

von Rolf Magnus (Gast)


Lesenswert?

> int main()
> int main(int argc)

Diese Variante ist nicht vorgeschrieben, aber auch nicht verboten.

> int main(int argc, char ** argv)

> Das Environment als dritten Parameter:
>
> int main (int argc, char * argv[], char * envp)
>
> Geht aber möglicherweise nur mit GNU-C

Die ist nach ISO C ebenfalls nicht vorgesehen, aber auch nicht verboten.


>>— argv[argc] shall be a null pointer.
>
> Man beachte das "shall" -> Weiche Anforderung. muß nicht erfüllt
> werden

Unsinn.  Da steht "shall", nicht "should".
Davon abgesehen ist der Begriff "shall" in der ISO-Norm ebenfalls 
definiert:

In this International Standard, ‘‘shall’’ is to be interpreted as a 
requirement on an implementation or on a program; conversely, ‘‘shall
not’’ is to be interpreted as a prohibition.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.