C Console Anwendung

Gast #4830589
Guten Morgen,

eine C Consolen Anwendung möchte ich nun so erweitern, dass beim Aufruf 
des Programmes auch noch Paramter übergeben werden können.

Wie kann zum Beispiel eine IP-Adresse als Parameter bearbeitet werden? 
Es gibt in der main Funktion zwei Übergabeparamter.
1
int _tmain(int argc, char* argv[])

Wenn der erste Parameter eine IP-Adresse ist dann steht dieser String in 
argv. Wie kann nun dieser String oder char Array in eine interne 
Variable abgelegt werden?
Gast #4830593
leo schrieb:
> Wenn der erste Parameter eine IP-Adresse ist dann steht dieser String in
> argv. Wie kann nun dieser String oder char Array in eine interne
> Variable abgelegt werden?

der erste Parameter ist die Anzahl er Einträge im Array des 
2.Parameters.

> Wie kann nun dieser String oder char Array in eine interne
> Variable abgelegt werden?
Inhalt kopieren.
#4830611
So kannst du die Parameter erstmal anzeigen.
1
for(int i=0;i<argc;i++)
2
  puts(argv[i]);

argv[i] ist ein Zeiger auf einen C-String.
Du kannst damit also fast alle Stringoperationen machen.
Du darfst den Inhalt aber nicht verändern (darum fast).
Gast #4830759
Mark B. schrieb:
> Das könnte man immer noch, wenn man in seinem Programm eine Kopie des
> originalen Strings anlegt.

Es gab mal Zeiten, das sind Programmierer sparsam mit Resourcen 
umgegangen.


> Insofern ist das für mich kein sinnvoller Grund, um zu erlauben die
> Eingabeparameter zu verändern.
es spricht aber auch nicht dagegen, sie müssen eh in den Adressraum vom 
der Anwendung kopiert werden, warum sollte man sie dann read-only 
machen?
Gast #4830763
Mark B. schrieb:
> Rolf Magnus schrieb:
>> Dirk B. schrieb:
>>> Du darfst den Inhalt aber nicht verändern (darum fast).
>>
>> Warum nicht? ISO-C erlaubt das explizit.
>
> Nur welchen Sinn sollte das haben?

Weniger auf die Strings selber als auf das Array aus Zeigern bezogen: 
Man kann die Argumente an eine Funktion einer Bibliothek übergeben, die 
die für sie relevanten Parameter verarbeitet und dabei gleich aus der 
Liste entfernt.
#4830767
Mark B. schrieb:
> Peter II schrieb:
>> Mark B. schrieb:
>>> Nur welchen Sinn sollte das haben?
>>
>> man kann man strtok arbeiten.
>
> Das könnte man immer noch, wenn man in seinem Programm eine Kopie des
> originalen Strings anlegt.
>
> Insofern ist das für mich kein sinnvoller Grund es zuzulassen die
> Eingabeparameter zu verändern.

Doch, es ist einfach defensives Verhalten.

Irgendeiner macht es doch und was soll dann passieren?
Ein Crash? Ein BoD, weil der User bös war?
Da ist es doch besser, die Runtime kann mit potentiellen Fehlern 
umgehen.
Gast #4830768
Mark B. schrieb:
> Peter II schrieb:
>> Mark B. schrieb:
>>> Nur welchen Sinn sollte das haben?
>>
>> man kann man strtok arbeiten.
>
> Das könnte man immer noch, wenn man in seinem Programm eine Kopie des
> originalen Strings anlegt.

Klar könnte man. Muss man aber nicht, da man auch das Original verändern 
kann. Wozu sollte man diesen Zusatzaufwand erzwingen?
#4830774
Rolf Magnus schrieb:
> Mark B. schrieb:
>> Peter II schrieb:
>>> Mark B. schrieb:
>>>> Nur welchen Sinn sollte das haben?
>>>
>>> man kann man strtok arbeiten.
>>
>> Das könnte man immer noch, wenn man in seinem Programm eine Kopie des
>> originalen Strings anlegt.
>
> Klar könnte man. Muss man aber nicht, da man auch das Original verändern
> kann. Wozu sollte man diesen Zusatzaufwand erzwingen?

Zum Beispiel weil man im Ablauf des Programms an einen Punkt gelangen 
könnte, an dem man doch wieder gerne die originalen Eingabeparameter 
hätte.

Wenn man etwas nicht verändern können muss, dann sollte es auch 
unveränderbar sein. Das Ergebnis ist in aller Regel bessere und 
sauberere Software.
#4830775
leo schrieb:
> Wenn der erste Parameter eine IP-Adresse ist dann steht dieser String in
> argv. Wie kann nun dieser String oder char Array in eine interne
> Variable abgelegt werden?

Zum Beispiel so:

1
#include <stdio.h>
2
#include <string.h>
3

4
#define IPV4_ADDRESS_MAX_STRING_SIZE 16
5

6
int main(int argc, char* argv[])
7
{
8
    char ip_address[IPV4_ADDRESS_MAX_STRING_SIZE];
9
    
10
    if (argc == 2)
11
    {
12
        strncpy(ip_address, argv[1], IPV4_ADDRESS_MAX_STRING_SIZE);
13
        // adding string termination because it might not be there
14
        ip_address[IPV4_ADDRESS_MAX_STRING_SIZE-1] = '\0'; 
15
        
16
        printf("IP address: %s\n", ip_address);
17
    }
18
    
19
    return 0;
20
}
Gast #4830779
Mark B. schrieb:
> Zum Beispiel weil man im Ablauf des Programms an einen Punkt gelangen
> könnte, an dem man doch wieder gerne die originalen Eingabeparameter
> hätte.
>
> Wenn man etwas nicht verändern können muss, dann sollte es auch
> unveränderbar sein. Das Ergebnis ist in aller Regel bessere und
> sauberere Software.

also macht du von jedem Parameter eine Funktion bei dir intern immer 
eine Kopie weil du später eventuell das Orginal noch einmal brauchst?
Gast #4830788
Mark B. schrieb:
> Peter II schrieb:
>> also macht du von jedem Parameter eine Funktion bei dir intern immer
>> eine Kopie weil du später eventuell das Orginal noch einmal brauchst?
>
> Wenn ich die Originale gar nicht verändere, dann brauche ich natürlich
> auch keine Kopien.

du musst ja auch nicht die Parameter verändert du kannst es. Damit hat 
man mehr Freiheiten. Wie hätte man bei C es denn verhindert sollen? 
Const gab es nicht.
Gast #4830854
Hallo Mark,

erstmal vielen Dank für deinen Post. Dein Beispiel funktioniert bei mir 
nicht. Es wird nur das erste Zeichen ausgegeben. Muss ich eventuell in 
den Einstellungen unter Visual Studio 10 was verändern?
#4830900
leo schrieb:
> Hallo Mark,
>
> erstmal vielen Dank für deinen Post. Dein Beispiel funktioniert bei mir
> nicht. Es wird nur das erste Zeichen ausgegeben. Muss ich eventuell in
> den Einstellungen unter Visual Studio 10 was verändern?

Mein Code-Beispiel ist reines C, da werden keine speziellen Eigenheiten 
von Microsoft Windows berücksichtigt. Der Link von Yalu X gibt Dir die 
passende Antwort auf Deine Frage.
Gast #4830936
Bei mir funktioniert das Beispiel von Mark in VS 2015 und VS 2017 RC 
ohne Änderungen der Optionen.
BTW: Warum verwendest du eigentlich eine rund 7 Jahre alte Version von 
VS bzw. des Compilers?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.