C Übungen



  • die werden dann wichtig wenn:
    dein programm an der eingabeaufforderung mit irgendwelchen parametern gestartet werden soll, die den programmablauf steuern.



  • Hast du vielleicht ein Beispiel für mich?



  • <pseudocode>

    if argc > 1 && argv[1] then
    if argv[1] content == "do that" then
    do_that()
    

    </pseudocode>
    🙂

    wenn du damit nix anfangen kannst, schreib dir am besten ein kleines c-programm, das dir den inhalt des argv arrays ausgibt. das argv-array speichert
    die kommandozeilen-parameter.
    sind ja bloss ein paar zeilchen.



  • Werd ich mich nochmals genauer mit beschäftigen wenn ich es brauche. Das wäre dann auch besser fürs Verständis.
    Danke

    Gruß Lone



  • So ich hab mich wollte das mit den Kommandozeilenparamtern ma testen und hab unter Visual Studio folgendes Programm geschrieben:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>

    main(int argc, char argv[]) {
    double x,y,z;
    if(argc < 4) {
    printf("\nAufruf: %s zahl1 op zahl2",argv[0]);
    exit(1);
    }
    x=atof(argv[1]);
    y=atof(argv[3]);
    switch(argv[2][0]) {
    case '+':
    z=x+y;
    break;
    case '-':
    z=x-y;
    break;
    case 'x':
    z=x
    y;
    break;
    case '/':
    z=x/y;
    break;
    default:
    printf("\nFalsches Operationszeichen!");
    exit(2);
    }
    printf("%s %s %s = %f",argv[1],argv[2],argv[3],z);
    getch(0);
    }

    Das Programm hab ich als Bspl0067.c abgespeichert , aber ich kanns nicht mit der Eingabeaufforderung starten. Er sagt mir immer das er das Programm nicht finden kann. Normalerweise benutze ich die Eingabeaufforderung nicht um Programme zu starten, dafür habe ich mir doch ne IDE geholt...
    Was mache ich falsch?



  • Ich möchte mich ja nur auf die Umschulung zum Fachinformatiker -Anwendungstechnik vorbereiten...
    Genauso ist es auch mit der Fehlerkontrolle. Da gibt es wieder bestimmte Befehle um Fehler sichtbar zu machen falls ich mit der Eingabeaufforderung arbeite. Das wird aber auch von VS erledigt. Also bleibt nurnoch die Frage wann man solche Sachen wirklich braucht.



  • Dieses Programm soll Texte erfassen und speichern. Mit fprintf schreibe ich in die Datei. Okay nun starte ich das Programm und kann den Dateinamen eingeben und er schreibt die Datei wurde geoeffnet. Beim nächsten Tastendruck geht das Programm jedoch aus obwohl da noch nicht wirklich viel passiert ist. Irgendwas läuft schief...ob es nun an der Eingabeaufforderung liegt oder am Programm ich hab keine Ahnung.

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>

    main() {
    FILE *stream;
    char zeile[81],dateiname[67];
    int zeilen=0;

    printf("\n\t\tTextzeilen erfassen\n");
    printf("\nSpeichern unter >");
    gets(dateiname);

    if((stream = fopen(dateiname,"w")) == NULL) {
    printf("Fehler beim Oeffnen!");
    exit(1);
    }

    printf("\nLeerzeile beendet das Programm.");
    printf("\n--------------------------------\n");

    gets(zeile);
    while(strlen(zeile) > 0) {
    fprintf(stream,"%s\n",zeile);
    zeilen++;
    gets(zeile);
    }
    fclose(stream);

    printf("\n%i Zeilen wurden geschrieben.\n",zeilen);

    getch(0);
    }



  • 1. Benutze erstens cpp tags des Forums
    2. Mit

    $ seq 39 | awk '{ text=sprintf("%s%s", text, $1);} END { print text }' | ./deinprogramm
    

    habe ich bereits einen Buffer Overflow erzeugt, denk nach warum. Tipp: man: gets(3) wenn du das gelöst hast, wird wahrscheinlich dein Programm nachher auch gehen.



  • Das Programm stammt aus einem alten Lernbuch und das habe ich mehrmals kontrolliert. Das ist unwahrscheinlich das es am Programm liegt. Visual Studio zeigt auch keine Fehler an und springt in die Konsole rein. Bis jetzt kann ich die Konsole auch nur benutzen um Programme zu öffnen aber nicht zu starten. Da muss irgendwo der Fehler sein. Ich hab auch keine Ahnung wie ich ohne IDE kompiliere oder sontiges. Wenn dieses gets() ein Buffer Overflow verursacht dann müssten die vorherigen Programme alle nicht gehen.



  • gets kann einen Buffer Overflow erzeugen, muss aber nicht. Ich habe aber einen Fall konstruiert, wo das passiert. Siehe fgets(3)



  • Okay das mit der Datei einlesen hat funktioniert das war ein Fehler mit Visual Studio. Jetzt brauch ich nurnoch eine Lösung für das 1. Programm. Über die Eingabeaufforderung öffnet er nur das Programm mit Visual Studio aber er beachtet die Parameter nicht.


Anmelden zum Antworten