if dingsie geht nicht ...



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Und was ist jetzt mit meinem code ? wist ihr was da falsch is `?



  • Du vergleichst in Zeile 14 und 20 einen String mit einer Zahl. Versuch es als Integer einzulesen, statt als String.



  • BDG-extreme schrieb:

    Und was ist jetzt mit meinem code ? wist ihr was da falsch is `?

    Schmeiß mal die system- Calls raus. Gefährlich ist auch fflush(stdin). Lies mal nach, warum.

    Genmutant schrieb:

    Du vergleichst in Zeile 14 und 20 einen String mit einer Zahl. Versuch es als Integer einzulesen, statt als String.

    Oh, da hat er natürlich recht!



  • if (wahl==1)
    // getchar; schmeiß das mal raus
    {              
      Alter = Alter + 30; // Alter+=30; ist übersichtlicher
      printf("In 30 Jahren bist du %d Jahre alt !\n", Alter);
    }
    

    Auch bin ich mir bei scanf("%d", &wahl); nicht sicher, wenn wahl ein char ist. Ich würde wahl als int deklarieren.



  • hmm also ich hab ein paar sachen geändert ... aber wenn man dann 1 drückt beendet es sich einfach ... Mit ein paar begriffen wie system calls wusste ich nicht was das sein soll da ich ja noch toal der anfänger bin .... Also hier mein
    Code :

    #include <stdio.h> 
    #include <stdlib.h> 
    
    int main(int argc, char *argv[]) {   
      system ("color 0A");   
      int Alter;   
      printf("gebe ein wie alt du bist:");   
      scanf("%d",&Alter);      
      printf("Du bist %d Jahre alt !\n",Alter);   
      char wahl; 
      printf("Wolen sie wissen wie alt sie in 30  Jahren sind ? Wenn ja druecken sie <1> wenn nicht <2>"); 
      scanf("%s", &wahl); 
      if (wahl==1)  
      {               
      Alter = Alter + 30; 
      printf("In 30 Jahren bist du %d Jahre alt !\n", Alter); 
      } 
      if (wahl==2) 
      { 
      system("PAUSE");   
      }   
    return 0; 
    }
    

    Und was ist jetzt Falsch ? 😕



  • Ganz wichtig: Rück deinen Code richtig ein, damit er übersichtlich ist. Also nach jedem { eine weitere Einrückebene bis zum passenden }.

    Ein großer Fehler: Du deklarierst wahl als char (also ein Zeichen) und versuchst wahl dann aber mit scanf("%s", &wahl); einzulesen. %s ließt aber Strings (also mehrere Zeichen) ein. Selbst wenn nur ein Zeichen gelesen wird, wird es bei einem String mit \0-terminiert (also Platz für zwei Zeichen nötig).

    Was du aber eher willst, ist wahl als Integer. Zumindest vergleichst du später auf 1 und 2 und nicht auf die Zeichen '1' und '2'. (Das ist ein wesentlicher Unterschied!)

    Außerdem solltest du idealerweise nach jedem scanf ein getchar(); machen, um im Tastaturbuffer vorhandene Zeilenumbrüche auszulesen.



  • rüdiger schrieb:

    Außerdem solltest du idealerweise nach jedem scanf ein getchar(); machen, um im Tastaturbuffer vorhandene Zeilenumbrüche auszulesen.

    Hätte da mal eine Frage, wär es nicht auch möglich z.B. das 2. scanf mit folgendem Pattern "%*[^\n]\n%c" zu verwenden um die getchar() Schleife zu vermeiden? Klappt das dann auch mit win/mac?



  • Im ANSI C Standard gibt es keine RegExp.



  • Fallen Angel schrieb:

    Im ANSI C Standard gibt es keine RegExp.

    RegExp sind dann doch schon etwas mächtiger... aber schau mal hier ISO/IEC 9899:1999 @ 7.19.6.2.10/12 :p



  • Bin jetzt nicht der Normen-Spezi:
    musste suchen:
    http://linuxreviews.org/man/scanf/

    sollte schon mit C89 gehen: Pattern "%*[^\n]\n%c"



  • BDG-extreme schrieb:

    Mit ein paar begriffen wie system calls wusste ich nicht was das sein soll da ich ja noch toal der anfänger bin

    Evtl. die Befehle die system(...); lauten?



  • Ich hab mal was korrigiert:

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h> //Dies habe ich includiert, um die unten aufgeführte Funktion getch() zu unterstützen.
    
    int main(int argc, char *argv[]) {  
     int Alter;  
     int wahl; //Unten liest du nur 1 oder 2 ein. Dies sind Zahlen, benutze also Integer. Dann kannst du sie leichter vergleichen.
     system ("color 0A");   
     printf("gebe ein wie alt du bist:");  
     scanf("%d",Alter); // Ein "&" niemals bei Integer setzten!   
     printf("Du bist %d Jahre alt !\n",Alter);  
    
     printf("Wolen sie wissen wie alt sie in 30  Jahren sind ? Wenn ja druecken sie <1> wenn nicht <2>");
      scanf("%d", wahl); //HIer habe ich "%s" nach "%d" geändert, weil "wahl" oben jetzt als Integer deklariert ist.
      if (wahl==1)  //Hier lag der Fehler in deinem Programm. Einen Char kann man
                   //auf diese Weise nicht vergleichen, deswegen stürzte dein
                   //Programm ab.
                   //Ich habe den Fehler behoben, indem ich "wahl" wie du oben 
                  //schon gesehen hast als integer deklariert habe.
                  //Leider erkennen manche Compiler derartige Fehler nicht. Wenn du Chars vergleichen willst, benutze strcmp()
      {              
      Alter+=30 //Ist überscihtlicher und nicht so lang, bewirkt aber dasselbe.
      printf("In 30 Jahren bist du %d Jahre alt !\n", Alter);
      }
      if (wahl==2) //s.o.
      {
      getch(); //system("PAUSE"); ist böse. Benutze stattdessen getch();, so wie hier. Die dafür nötige libary hab ich oben includiert.
      }  
    return 0;
    }
    

    Deine Rechtschreibfehler hab ich jetz nich korrigiert :p



  • tecnologymaster schrieb:

    Ich hab mal was korrigiert:

    leider nicht richtig

    tecnologymaster schrieb:

    ..
     int Alter;  
     int wahl; //Unten liest du nur 1 oder 2 ein. Dies sind Zahlen, benutze also Integer. Dann kannst du sie leichter vergleichen.
     system ("color 0A");   
     printf("gebe ein wie alt du bist:");  
     scanf("%d", &Alter); // Ein "&" immer bei Integer setzten!   
      ...
     scanf("%d", &wahl); //HIer habe ich "%s" nach "%d" geändert, weil "wahl" oben jetzt als Integer deklariert ist.
      ...
    

    Hier lag der Fehler in deinem Programm. Einen Char kann man
    auf diese Weise nicht vergleichen, deswegen stürzte dein
    Programm ab.

    nein, daran liegt das Problem nicht, sondern daran, dass scanf 2 Bytes versucht zu schreiben, Schreibrechte nur bei dem ersten hat und beim zweiten ein undefiniertes Verhalten verursacht, was zu segfault führen kann. Am Vergleich (der natürlich falsch war) lag es nicht.

    edit: der OP hat nie von Abstürzen geredet, weiß nicht, woher du das hast 😕 sollte es segfaults gegeben haben, dann lag es nicht am if(wahl == 1). Für den OP: 1 != '1' und wenn du über die Tatstaur eine 1 eingibst, dann wird '1' und nicht 1 gelesen und das ist die Ursache.


Anmelden zum Antworten