Forum: PC-Programmierung C Console Anwendung


von leo (Gast)


Lesenswert?

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?

: Verschoben durch Moderator
von Peter II (Gast)


Lesenswert?

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.

von Walter S. (avatar)


Lesenswert?

such einfach nach "Übergabeparameter main",
dann brauchst Du dir die folgenden Kommentare nicht antun

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

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).

von Rolf Magnus (Gast)


Lesenswert?

Dirk B. schrieb:
> Du darfst den Inhalt aber nicht verändern (darum fast).

Warum nicht? ISO-C erlaubt das explizit.

von Mark B. (markbrandis)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

Mark B. schrieb:
> Nur welchen Sinn sollte das haben?

man kann man strtok arbeiten.

von Dirk B. (dirkb2)


Lesenswert?

Rolf Magnus schrieb:
> Dirk B. schrieb:
>> Du darfst den Inhalt aber nicht verändern (darum fast).
>
> Warum nicht? ISO-C erlaubt das explizit.

Danke.

von Mark B. (markbrandis)


Lesenswert?

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.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

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?

von Rolf Magnus (Gast)


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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?

von Mark B. (markbrandis)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

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
}

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

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?

von Mark B. (markbrandis)


Lesenswert?

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?

Es kommt wie immer auf den Anwendungsfall an.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

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.

von Mark B. (markbrandis)


Lesenswert?

Peter II schrieb:
> 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.

Wir werden langsam off-topic ;-)

Sehe ich es dann richtig, dass dies in C erlaubt ist aber in C++ nicht? 
Oder dort auch?

von leo (Gast)


Lesenswert?

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?

von Dirk B. (dirkb2)


Lesenswert?

leo schrieb:
> Es wird nur das erste Zeichen ausgegeben.

Arbeitest du mit wchar, bzw. UTF16 ?

von Yalu X. (yalu) (Moderator)


Lesenswert?


von leo (Gast)


Lesenswert?

Visual Studio Einstellung --> Allgemein --> Zeichensatz:
Unicode-Zeichensatz verwenden.

Somit arbeite ich mit UTF16

von Mark B. (markbrandis)


Lesenswert?

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.

von Blink-128 (Gast)


Lesenswert?

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?

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.