Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » kommandozeilenargumente

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
23.11.2003, 16:58 Uhr
~sebbraun
Gast


Wer kann mir bei folgendem Problem helfen:

Das Programm das ich schreiben muss, sieht folgendermaßen aus:

C++:
int main(int argc, char** argv)
{
...



Hierbei werden Komandozeilenargumente auf den Vektor char** argv eingelesen.Es handelt sich bei den Daten um zahlenfolgen die durch einen bindestrich getrennt sind : 111111-20 222222-18 .
Diese möchte ich nun als integerwerte auf zwei getrennte Felder kopieren:
im ersten feld soll dabei jeweils die zahl vor dem Bindestrich gespeicher werden
also:
arrayeins[1] == 111111
arrayeins[2] == 222222
im Zweiten Feld die zweite zahl:
arrayzwei[1} == 20
arrayzwei[2] == 18

Bei den daten handelt es sich umm matrikelnummern (6stellig) mit zughörigem Klausurergebnis (0-20) pkt.

Dieser Post wurde am 23.11.2003 um 16:59 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.11.2003, 17:06 Uhr
Pablo
Supertux
(Operator)


Also, wenn ich das richtig verstanden habe:


Code:
$ ./programm 111111-20 222222-18


soll die Eingabe sein.
Dann versuche folgendes:


C++:
#include <stdio.h>
int main(int argc, char** argv)
{
    int matnmr[2];
    int note[2];
    int i;
    sscanf(argv[1],"%d-%d", &matnmr[0], &note[0]);
    sscanf(argv[2],"%d-%d", &matnmr[1], &note[1]);

    for(i=0; i<2; ++i)
        printf("Mat nmr: %d. Note: %d\n", matnmr[i], note[i]);

    return 0;
}




Bearbeitung:

Das wäre für den allgemeinen Fall, dass man beliebig viele xxxxxx-yy übergibt.

C++:
#include <stdio.h>
#include <malloc.h>
int main(int argc, char** argv)
{
    int* matnmr;
    int* note;
    int i;
    if ((matnmr = (int*)malloc(sizeof(int)*(argc-1)))==NULL) {
        fprintf(stderr, "Kein Speicher mehr.\n");
        return 1;
    }
    if ((note = (int*)malloc(sizeof(int)*(argc-1)))==NULL) {
        free(matnmr);
        fprintf(stderr, "Kein Speicher mehr.\n");
        return 1;
    }
    for(i=0; i<argc-1; ++i)
        sscanf(argv[i+1],"%d-%d", &matnmr[i], &note[i]);

    for(i=0; i<argc-1; ++i)
        printf("Mat nmr: %d. Note: %d\n", matnmr[i], note[i]);

    free(matnmr);
    free(note);

    return 0;
}




--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 23.11.2003 um 17:20 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.11.2003, 18:19 Uhr
~sebbraun
Gast


Danke, is echt gut dein proggramm.
Hab aber leider das problem dass ich deine beiden include direktiven nicht benutzen darf.
Die funktion ist teil eines Programms dass ich als hausarbeit machen muss.
Dabei darf ich nur die elemntaren direktiven <iostream>, <cmath>,<cstring> beutzen.
Ich hab mir mittlerweile schon gedanken gemacht wie ich das ganze realisieren will, habe aber das problem mit der Handhabung des argumentenvektors.
Dachte mir ich lese die einzelnen Strigs erst in ein global definiertes FEld aus, aber das navigieren mit dem doppelpointer verwirrt mich.
Es würde mir warscheinlich schon reichen wenn du mir erklären könntest wie
ich bei der zeile: int main(int argc, char** argv)

- den argumentenvektor an eine funktion void(....) übergebe
- in dieser funktion einen pointer auf die einzelnen strings initialisiere und navigiere
- in dieser funktion einen pointer innerhalb der strings initialisiere und navigiere
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.11.2003, 18:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


dann mach es folgendermaßen:


C++:
#include <iostream>
int main(int argc, char** argv)
{
    int* matnmr;
    int* note;
    int i;
    try {
      matnmr = new int[argc-1];
    }
    catch(...) {
        std::cerr << "Kein Speicher mehr" <<endl;
        return 1;
    }
    try {
      note = new int[argc-1];
    }
    catch(...) {
        delete[] matnmr;
        std::cerr << "Kein Speicher mehr" <<endl;
        return 1;
    }
    for(i=0; i<argc-1; ++i)
        sscanf(argv[i+1],"%d-%d", &matnmr[ i ], &note[ i ]);

    for(i=0; i<argc-1; ++i)
        std::cout << "Mat nmr: " << matnmr[i] << ". Note: " << note[ i ] <<endl;

    delete[] matnmr;
    delete[] note;

    return 0;
}




Bearbeitung:

Was mir grad auffällt, was gibt es als ersatz für sscanf? ich steh grad aufm Schlauch


--
class God : public ChuckNorris { };

Dieser Post wurde am 24.11.2003 um 18:58 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.11.2003, 18:48 Uhr
Pablo
Supertux
(Operator)


Ok, du willst die Lösung für C++. Dann ersertze printf mit std::cout

C++:
printf("Das ist %d eine printf Funktion.\n", z);
std:.cout << "Das ist " << z << " keine printf Funktion" << std:.endl;



Das ist die C++ Lösung für printf.
Statt malloc benutze den new Operator von C++. Und an der Stelle von free benutze delete [] arrayname;
Was ich leider nicht weiß, ist welche STL Funktion sscanf ersetzen kann. Sorry, ich programmiere nur mit C.

Bearbeitung:
@Flo war ein bisschen schneller. Hmmmm, it sscanf in iostream deklariert?

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 24.11.2003 um 18:49 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.11.2003, 18:49 Uhr
~fickinger
Gast


so einfach??wahnsinn!

Habe jetz schätzungsweise 3-4 h an dem problem gearbeitet.
meine letzte "lösung" hatte mehrere geschachtelte schleifen....
was macht sscan genau?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.11.2003, 18:51 Uhr
Pablo
Supertux
(Operator)


sscanf ist das selbe wie scanf, mit dem Unterschied, dass sscanf den Buffer nicht von stdin (standardeingabe=Tastatur) nimmt, sondern von einem char* (Zeichenkette).
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.11.2003, 18:52 Uhr
typecast
aka loddab
(Operator)


In C++ kann man die sscanf-Geschichte durch einen Stringstream ersetzen. Einfach einen string reinstecken und eine Zahl rausholen.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
24.11.2003, 18:55 Uhr
Pablo
Supertux
(Operator)


Das weiß ich auch, ich weiß leider nur nicht, wie man das macht. Die C Lösung gefällt mir besser!
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.11.2003, 19:01 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Argumentvektor würde ich es nicht bezeichnen, ist ein Argumentarray, sogar ein 2dimensionales:


Code:
argv[0] = char[strlen(param)] für parameter 1
argv[1] = char[strlen(param2)] für parameter 2



Ausnahmsweise war ich mal schneller
--
class God : public ChuckNorris { };

Dieser Post wurde am 24.11.2003 um 19:01 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: