Hilfe bei C-Programm



  • ups sorry was mach ich denn da, so kann das natürlich nicht gehen. Bitte vielmals um entschuldigung.



  • Habs mir gerade gedacht, weil es nicht funktioniert bei mir.
    Bin schon am verzweifeln



  • probiers mal so, indem du den Eingabe - Wert als nen String lässt also z.b.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(void)
    {
       int key;
       char *input;
    
       while(strncmp(input, "q", 1) != 0)
       {
          scanf("%s", input);
          key = atoi(input);
          printf("In = %s\nKey = %d\n", input, key);
       }
    
       return 0;
    }
    

    (ist blos als bsp gedacht, also nicht gleich wieder fertigmachen *g*)



  • Oh mann, ich muss zugeben, das ich noch zu sehr Anfänger bin, damit ich das verstehe.
    Für was steht char *Input? Da kommt bei mir eine fehlermeldung, das die variable input nicht bekannt ist



  • char *input ist ne Variablen deklaration, geauso wie int key, nur dass der "*" "zeiger auf" bedeutet.

    sieh dir mal www.pronix.de Kap Zeiger durch, dann müsste es klarer werden.



  • Wenn ich das Programm ausprobiere kommt bei mir immer eine Fehlemeldung
    ..das die Exe Datei beendet werden muß usw..



  • ich will dir ja auch net die ganze arbeit abnehmen, dass sollte nur als Anregung gelten, dass dass so nicht wirklich funkt ist mir auch klar. *g*

    aber du willst doch auch was lernen oder ?!?
    ohne fleiß kein preis, probier einfach ein bisschen damit rum, schreib dir am besten ein ganz einfaches Progi, dass dir die Eingabe von der Tastatur abfragt und wieder ausgiebt, danach überprüfe die eingabe und beende bei einer bestimmten bedingung usw... klein anfangen und groß aufhören, die Guru - progger machen das au net anders.

    wenn du dann immer noch net weiter weißt, können wir dir immer noch helfen, aber fertigen Code wirst du hier nie bekommen.



  • Ach so ja, was ich noch loswerden wollte, wenn du dir keine Feinde machen willst, verwende sachen wie goto möglichst gar nicht, das kann man alles in schleifen machen, weil es gibt auch befehle mit denen man quer durchs prog springen kann, und das macht dann richtig spass zum debuggen vor allem bei richtig grossen progis.



  • Hallo
    Ich will ja eh gar keinen fertigen Code.
    Ich bin nur unter starkem Zeitdruck, weil ich noch andere Prügungen habe.
    Binh um jeden noch so kleinen Tip dankbar
    Ich hab mir jetzt gedacht, das ich das mit q vielleicht über ein Extra Menü mache, das frägt, ob ich beenden will der nicht. Dann gibts halt Abzug in der Note, aber egal.

    Einziges Problem ist jetzt noch, warum das nicht funktioniert:
    {
    start:
    printf ("Geben sie eine Zahl ein");
    test=scanf ("%i",&zahl);
    if (test ==0) goto start;
    while (zahl>9) ber();
    printf ("Quersumme ist %i",zahl);
    goto start;
    ende:
    return 0;
    }

    mit test=scanf... bekomme ich als test eine 0, wenn ein buchstabe eigegeben wird. Gebe ich ein if (test==0) goto ende, beendet er mir das Programm, wenn ich einen Buchstaben eingeben.
    Geb ich aber ein goto start: weil ja wieder nach einer neuen Zahl gefragt werden soll, dann erscheint am Bildschirm unendlich oft:Geben Sie eine Zahl ein, und ich hab gar keine Möglichkeit eine Zahl einzugeben.
    Ich hätt schon versucht, bevor er zurückspringt, die Zahl auf 0 oder test auf 1 zu setzten, aber ich bekomm immer eine Endlosschleife



  • mach dir mal dazwischen ein fflush(stdin) rein, aber das problem ist wie öffnest du das menü ?????? (na merkst was)



  • tut mir leid ich versteh nur Bahnhof



  • Quelle: www.pronix.de
    6.2. Probleme und ihre Behandlung mit scanf

    Ein häufiges Problem, das auftritt, wenn man scanf() für die Eingabe verwenden ist die Pufferung. Diese ist je nach System und Anwendung, Zeilen- oder Vollgepuffert. Dies gilt wiederum nicht für die Standardfehlerausgabe (stderr), die laut ANSI C, niemals vollgepuffert sein darf. Bevor ich weiter erkläre, folgendes Programm zum testen:

    #include <stdio.h>
    int main()
    {
        char a,b,c,tmp;
        printf("1. Buchstabe : ");
        scanf("%c",&a);
        printf("2. Buchstabe : ");
        scanf("%c",&b);
        printf("3. Buchstabe : ");
        scanf("%c",&c);
        printf("Sie gaben ein : %c %c %c ",a,b,c);
        return 0;
    }
    

    Was ist passiert? Warum wird der zweite Buchstabe immer übersprungen? Wie gesagt das Problem liegt hier an der Pufferung. Und C kennt nun mal keinen Befehl (wie etwa chomp bei Perl), um das letzte Zeichen zu entfernen.

    In diesem Beispiel wurde als erster Buchstaben "a" eingegeben und [ENTER] gedrückt. Und dieses [ENTER] (\n = newline) befindet sich immer noch im Puffer der Standardeingabe und wird automatisch für das zweite Zeichen verwendet. Was kann man dagegen tun? Hierzu ein paar Möglichkeiten, die allerdings auch systemabhängig sind:

    Möglichkeit 1

    Alle 3 Buchstaben auf einmal eingeben:

    include <stdio.h>
    int main()
    {
        char a,b,c;
        printf("1.2. und 3. Buchstabe : ");
        scanf("%c %c %c",&a,&b,&c);
        printf("Sie gaben ein : %c %c %c ",a,b,c);
        return 0;
    }
    

    Möglichkeit 2

    Sie benutzen die Funktion fflush() zum entleeren des Tastaturpuffers. Was aber möglicherweise nicht auf jedem Betriebssystem (speziell nicht unter Linux) so funktioniert:

    #include <stdio.h>
    int main()
    {
        char a,b,c;
        printf("1. Buchstabe : ");
        scanf("%c",&a);
        fflush(stdin);
        printf("2. Buchstabe : ");
        scanf("%c",&b);
        fflush(stdin);
        printf("3. Buchstabe : ");
        scanf("%c",&c);
        printf("Sie gaben ein : %c %c %c ",a,b,c);
        return 0;
    }
    

    Möglichkeit 3

    Die wohl beste Möglichkeit. Man benutzt eine do-while-Schleife und zieht das newline-Zeichen aus dem Puffer heraus:

    #include <stdio.h>
    int main()
    {
     char a,b,c;
     printf("1. Buchstabe : ");
     do {scanf("%c",&a);} while ( getchar() != '\n' );
     printf("2. Buchstabe : ");
     do {scanf("%c",&b);} while ( getchar() != '\n' );
     printf("3. Buchstabe : ");
     do {scanf("%c",&c);} while ( getchar() != '\n' );
     printf("%c %c %c\n",a,b,c);
     return 0;
    }
    

    Möglichkeit 4

    Sie verwenden scanf erst gar nicht und greifen auf eine der vielen anderen Standardeingaben-Funktionen zurück. Ideal wäre es bsp. die Funktion fgets() zum Einlesen zu verwenden und die Eingabe mit der Funktion sscanf() in ein entsprechendes Format zu konvertieren.

    etc etc etc...........

    und das mit dem menü, dann musst do doch sowieso abrfagen ob ne bestimmte taste gedrückt wurde um es zu öffnen, dann kannst au glei nach "q" abfragen und sauber beenden, aber um gottes Willen nimm goto raus!



  • Danke das mit dem fflush(stdin) hat geholfen.
    Tja da hab ich jetzt wirklich ein problem mit dem Menü



  • Hab da mal was zusammen gestellt (sorry, eigentlich sollte es nur ein kleiner Tipp werden, am Ende war's dann aber doch ein ganzes Prog. ;)):

    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <string.h>
    
    int ber(int zahl){
        int quer=0;
    
        while(zahl!=0){
            quer=quer+zahl%10;
            zahl=zahl/10;
        }
        return quer;
    }
    
    int main(void){
        char zahl[10];
        int izahl, fehler, negativ;
    
        while(1){
            do{
                int i;
                izahl=0; fehler=0; negativ=0;
                printf("Geben sie eine Zahl ein: ");
                scanf("%s", zahl);
    
                if(!strncmp(zahl, "q", 2))
                    return 0;
    
                for(i=0; i<strlen(zahl) && !fehler; ++i)
                    if(!isdigit(zahl[i]) && zahl[0]!='-')
                        fehler=1;
    
                if(!fehler)
                    izahl=atoi(zahl);
            }while((izahl>-10 && izahl<10) || fehler);
    
            printf("Quersumme von %d ist: %d\n\n", izahl, ber(izahl));
        }
    }
    

    [ Dieser Beitrag wurde am 03.07.2003 um 22:22 Uhr von RTC editiert. ]



  • Vielen Dank

    Hab selber schon ein Programm zusammengebracht, aber meins ist bei weitem nicht so gut.

    Danke!!!!



  • @RTC
    Hab mehrere Fragen zu deinem Prog.
    Warum schreibst du das "int i;" in die Schleife ?
    Müsste beim strncmp nicht "q\n" stehen, wenn du schon 2 Zeichen vergleichst ?
    Und müsste in der do-while-Schleife nicht genau das umgekehrte, also
    z.B. !fehler getestet werden.

    @Hakkinen
    Was für eine Prüfung is'n das, für die du das Programm schreiben solltest.



  • Original erstellt von tiaz:
    **@RTC
    Hab mehrere Fragen zu deinem Prog.
    Warum schreibst du das "int i;" in die Schleife ?
    **

    Warum nicht? Es wird nur in der Schleife benötigt. Gut, man hätte es auch in main() deklarieren können, is Wurscht 😉

    Original erstellt von tiaz:
    Müsste beim strncmp nicht "q\n" stehen, wenn du schon 2 Zeichen vergleichst ?

    Wieso? Er soll nur abbrechen, wenn NUR q eingegeben wird. Wenn ein Zeichen dahinter steht, dann nicht. Deswegen die 2 Bytes. Und wieso \n? Das wird nicht abgespeichert in dem String. Wird nur q eingegeben, so ist der String q\0, wobei letzteres als Ende des Strings ja automatisch an ihn angehängt wird, sodass man darauf nicht mit strncmp() prüfen muss...

    Original erstellt von tiaz:
    **Und müsste in der do-while-Schleife nicht genau das umgekehrte, also
    z.B. !fehler getestet werden.
    **

    Nein: do{...}while(... || fehler); heißt: führe das Eingeben (und Konvertieren) einer Zahl solange durch, wie ein Fehler aufgetreten ist (oder die Zahl >-10 bzw. <10 ist)


Anmelden zum Antworten