C Console Anwendung

Gast #4830589
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?
Gast #4830593
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.
Gast #4830759
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?
Gast #4830763
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.
#4830767
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.
Gast #4830768
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?
#4830774
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.
#4830775
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
}
Gast #4830779
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?
Gast #4830788
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.
Gast #4830854
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?
#4830900
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren