Programm start mit null oder einem parameter und ein paar za

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Programm start mit null oder einem parameter und ein paar za

    hi
    mein problem
    denke für euch nen kleines für mich ein großes
    bin dabei C zu lernen und schreibe ein programm was mit ein paar parametern gestartet werden kann
    z.B:-s für summe aller zahlen
    zusätzlich sollen noch ne belibige menge zahlen mit eingelesen werden können dann sieht der programm aufruf in etwa so aus :
    dateiname -s 1 2 3 4

    und ausgegeben soll dann eine 10

    wie kann ich das machen das dass programm so funktioniert

    also ich lese die parameter über argv in ein array (das klappt)
    sieht ca so aus:

    for (i=0;i!=argc;++i)
    {
    assert(i>=0 && i<MAX_NUMBERS);
    werte=argv[i];
    }

    hab da dann aber alles in char* drin stehen

    frage 1:
    wie schaff ich das dass ich die zahelen vllt in ein zweites array schreibe aber dafür als int. damit ich damit weiter rechnen kann?

    frage 2:
    wie kann ich verhindern das mehr als 1 parameter angegeben wird bzw wenn das der fall is eine fehlermeldung ausgeben?

    danke für jede hilfreiche antwort

    Olli
  • Hallo....
    frage 1:
    wie schaff ich das dass ich die zahelen vllt in ein zweites array schreibe aber dafür als int. damit ich damit weiter rechnen kann?


    schon mal mit der funktion atoi() probiert? das wandelt die char's in zahlen um. sollte doch aber mit einem einfachen int-cast auch gehen: (int*)argv ...denke ich
    und dann kannst du es gleich als zahlen in das array schreiben, und nicht erst als char.

    frage 2:
    wie kann ich verhindern das mehr als 1 parameter angegeben wird bzw wenn das der fall is eine fehlermeldung ausgeben?


    da gibt es die möglichkeit, wie du es schon verwendet hast, das argc abzufragen.. wenn das halt 2 ist (weil programmname und ein parameter) dann ok, sonst fehlermeldung. oder je nachdem, wie du es halt willst
    unter linux gibt es da eine funktion: getopt() mit der kann man ziemlich einfach die übergebenen parameter auswerten. auch, ob verschienene flags zusätzliche parameter wollen, bzw. die anzahl derer.
    was es da so unter windows gibt, weiß ich nich ;)

    grüße, und viel erfolg
  • hi piepels,

    hab ma wieder was dazu geschrieben. finde atoi() in diesem fall etwas ungünstig -> was ist mit parameter "0"?
    atoi() gibt bei character ebenfalls 0 zurück. wie auseinanderhalten bei bestimmten operationen
    (bsp. multiplikation oder bitoperationen). deshalb schlage ich vor, zu casten und die ascii-zeichen auszulesen; is
    zwar nicht so elegant, behandelt aber das beschriebene problem. was meint der rest dazu?

    C-Quellcode

    1. /* Includefiles */
    2. #include <stdio.h>
    3. /* Defines */
    4. typedef enum _Bool_ my_bool;
    5. /* Enum */
    6. enum _Bool_
    7. {
    8. FALSE = 0,
    9. TRUE = 1
    10. };
    11. /* Declarations of Functions */
    12. my_bool CheckParameter(char *aString, int *ptrNumber);
    13. /* Main-Function */
    14. int main(int argc, char *argv[])
    15. {
    16. int i_loop, i_number;
    17. /********************************************
    18. Greeting
    19. ********************************************/
    20. printf("You started %s.\nHave fun.\n", argv[0]);
    21. printf("___________________________________________________________________\n\n");
    22. /********************************************
    23. Menu
    24. ********************************************/
    25. if(argc < 3) //if not enough parameter
    26. {
    27. printf("Sie haben zuwenig Parameter eingegeben.\n");
    28. return 1;
    29. }
    30. for(i_loop = 1, i_number = 0; i_loop < argc; i_loop++, i_number = 0)
    31. {
    32. //Check & convert parameter and do something with the integer-type-result
    33. if(CheckParameter(argv[i_loop], &i_number)) printf("Do something with number %d.\n", i_number);
    34. }
    35. /********************************************
    36. Passing
    37. ********************************************/
    38. printf("\n\n___________________________________________________________________\n\n");
    39. return 0;
    40. }
    41. /* CheckParameter -> convert parameter to number */
    42. my_bool CheckParameter(char *aString, int *ptrNumber)
    43. {
    44. int i_i, i_ascii, i_sign;
    45. i_i = i_ascii = i_sign = 0;
    46. if(*aString == '-') //if negative sign, set flag & increment char-pointer to next char
    47. {
    48. i_sign++;
    49. aString++;
    50. }
    51. while( (i_ascii = *(aString + i_i++)) != '\0') //loop until the string points to end-sign
    52. {
    53. if( (i_ascii < 48) || (i_ascii > 57) ) return(FALSE); //break if character is not a number
    54. *ptrNumber *= 10; //convert to number by int-casting
    55. *ptrNumber += ((int)i_ascii - 48);
    56. }
    57. if(i_sign) *ptrNumber = -*ptrNumber; //if negative sign is set, convert to negative number
    58. return(TRUE);
    59. }
    Alles anzeigen


    p.s.: wie kann ich eigentlich syntax-highlightened codetext hier reinschreiben?

    bless
    chris