Eingabe nicht anzeigen

  • C

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Eingabe nicht anzeigen

    Hallo,

    ich habe heute mit C angefangen und wollte ein kleines Zahlenraten programmieren (Wers nicht kennt: COmputer such sich zahl zw. 1 und 100 raus, man muss sie erraten und bekommt gesagt ob man drüber oder drunter liegt)
    Dafür hab ich folgenden Code geschrieben:

    C-Quellcode

    1. /* zahl.c */
    2. #include <stdio.h>
    3. #include <iostream>
    4. #include <cstdlib>
    5. #include <string>
    6. #include <time.h>
    7. using namespace std;
    8. int main(void) {
    9. srand(time(NULL));
    10. int min = 1;
    11. int max = 100;
    12. int mynumber = rand() %max+min;
    13. int entered, i;
    14. int x;
    15. int count = 0;
    16. printf("Ich denke mir eine Zahl zwischen %i und %i und du musst sie erraten!\n", min, max);
    17. // printf("%i\n", mynumber);
    18. for(i=0; i < 8000; i++) {
    19. scanf("%d",&entered);
    20. fflush(stdin);
    21. if (entered > mynumber)
    22. {
    23. printf("%i ist groesser wie meine Zahl!\n", entered);
    24. count++;
    25. }
    26. else if (entered < mynumber)
    27. {
    28. printf("%i ist kleiner wie meine Zahl!\n", entered);
    29. count++;
    30. }
    31. else {
    32. printf("%i ist meine Zahl! Richtig!\n", entered);
    33. printf("Du hast nur %i Versuche gebraucht!\n", count + 1);
    34. scanf("%d",&entered);
    35. return count + 1;
    36. }
    37. }
    38. scanf("%d",&x);
    39. return 0;
    40. }


    Aber leider kommt da dann so ne ausgabe:

    Quellcode

    1. 50
    2. 50 ist kleiner wie meine Zahl
    3. 70
    4. 70 ist groesser wie meine Zahl
    5. ...


    Ich will dass der die Eingabe während dem Tippen anzeigt, aber dann nach ENTER halt nur folgendes kommt:

    Quellcode

    1. 50 ist kleiner wie meine Zahl
    2. 70 ist groesser wie meine Zahl


    Wie bekomm ich das hin?

    Leseratte

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Leseratte“ ()

    Hm. Hab mal was gesucht und gelesen dass ich dafür wohl "gotoxy(x,y) brauch. Aber wie find ich die jetzigen x & y koordinaten raus um eine Zeile nach oben zu gehen? Und gotoxy wird angemeckert mit "Ist nicht definiert"...Gotoxy ist jetzt definiert, aber wie bedien ich es?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Leseratte“ ()

    Ungetestet:

    C-Quellcode

    1. #include <windows.h>
    2. bool MoveCursorRelative(int xOffset, int yOffset)
    3. {
    4. CONSOLE_SCREEN_BUFFER_INFO conInfo;
    5. HANDLE conOut = GetStdHandle(STD_OUTPUT_HANDLE);
    6. if (conOut == INVALID_HANDLE_VALUE)
    7. {
    8. return false;
    9. }
    10. if (!GetConsoleScreenBufferInfo(conOut, &conInfo))
    11. {
    12. return false;
    13. }
    14. COORD cursorLoc;
    15. cursorLoc.X = conInfo.dwCursorPosition.X + xOffset;
    16. cursorLoc.Y = conInfo.dwCursorPosition.Y + yOffset;
    17. if (!SetConsoleCursorPosition(conOut, cursorLoc))
    18. {
    19. return false;
    20. }
    21. return true;
    22. }


    Kann sein, dass du den Input flushen musst, bevor das sicher funktioniert.
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    Das liegt am scanf oder generell an den eingabe Befehlen.

    Du kannst entweder jedes mal die Konsole leeren sprich:

    Quellcode

    1. void clear()
    2. {
    3. #if defined(WIN32)
    4. system("cls");
    5. #endif
    6. #if defined(LINUX)
    7. system("clear");
    8. #endif
    9. }


    oder du verschönerst einfach die Eingabe so das es nicht immer so Grob rauskommt, sprich sowas halt:

    Quellcode

    1. printf("Deine Zahl: ");
    2. scanf("%d", &entered);
    msdn.microsoft.com/en-us/libra…op/ms686033(v=vs.85).aspx Windows
    Beispielcode (ungetestet)

    Quellcode

    1. HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    2. DWORD mode = 0;
    3. GetConsoleMode(hStdin, &mode);
    4. SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT));


    Linux:
    pubs.opengroup.org/onlinepubs/7908799/xsh/tcsetattr.html
    pubs.opengroup.org/onlinepubs/…/functions/tcgetattr.html
    Beispielcode (ungetestet)

    Quellcode

    1. termios term;
    2. tcgetattr(STDIN_FILENO, &term);
    3. termios newt = term;
    4. newt.c_lflag &= ~ECHO;
    5. tcsetattr(STDIN_FILENO, TCSANOW, &newt);


    Ach ja... das was du da veranstaltest ist kein C++. Printf und co. gehören nicht mehr in sauberen C++ Code. Diese alten C Funktionen wurden durch std::ostreams ersetzt und somit greift man jetzt direkt auf den Outputstream zu. Dies hat einige Vorteile und auch der Mythos, dass Printf schneller sei ist falsch.
    Aber naja was du nun genau programmierst weißt du ja anscheiend selbst nicht, da in deinem Code oben ein Kommentar mit "zahl.c" steht was auf eine C-Quellcodedatei schließen lässt.... Also vergiss als "C++"-Anfänger bitte nicht: Auch wenn viele das glauben C++ ist niiieeeeee im Leben C!

    Noch als Beispielcode (habs ebenfalls nicht getestet hab grad keinen commandline compiler parat und vs öffnen und projekt machen ist zu viel arbeit)
    Spoiler anzeigen

    C-Quellcode

    1. #include <string>
    2. #ifdef _WIN32
    3. #include <Windows.h>
    4. #endif
    5. #ifdef LINUX
    6. #include <termios.h>
    7. #endif
    8. using namespace std;
    9. string getStrMasked();
    10. int strToInt(string str);
    11. int main(void) {
    12. srand(time(NULL));
    13. int min = 1, max = 100;
    14. int mynumber = rand() %max+min;
    15. int entered;
    16. int count = 0;
    17. cout << "Ich denke mir eine Zahl zwischen " << min <<" und " << max << " und du musst sie erraten!" << endl;
    18. // printf("%i\n", mynumber);
    19. for(int i=0; i < 8000; i++) {
    20. entered = strToInt(getStrMasked());
    21. cin.clear();
    22. if (entered > mynumber)
    23. {
    24. cout << entered << " ist größer wie meine Zahl!" << endl;
    25. count++;
    26. }
    27. else if (entered < mynumber)
    28. {
    29. cout << entered << " ist kleiner wie meine Zahl!" << endl;
    30. count++;
    31. }
    32. else
    33. {
    34. cout << entered << "ist meine Zahl! Richtig!" << endl;
    35. cout << "Du hast nur " << (count + 1) << " Versuche gebraucht!" << endl;
    36. entered = strToInt(getStrMasked());
    37. return count + 1;
    38. }
    39. }
    40. cin.get();
    41. return 0;
    42. }
    43. #ifdef _WIN32
    44. string getStrMasked()
    45. {
    46. HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    47. DWORD mode = 0;
    48. GetConsoleMode(hStdin, &mode);
    49. SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT));
    50. string tmp;
    51. getline(cin, tmp);
    52. SetConsoleMode(hStdin, mode);
    53. return tmp;
    54. }
    55. #endif
    56. #ifdef LINUX
    57. string getStrMasked()
    58. {
    59. termios term;
    60. tcgetattr(STDIN_FILENO, &term);
    61. termios newt = term;
    62. newt.c_lflag &= ~ECHO;
    63. tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    64. string tmp;
    65. getline(cin, tmp);
    66. tcsetattr(STDIN_FILENO, TCSANOW, &term);
    67. return tmp;
    68. }
    69. #endif
    70. int strToInt(string str)
    71. {
    72. int tmp;
    73. std::stringstream(str) >> tmp;
    74. return tmp;
    75. }


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „thefiloe“ ()

    Bei dem oben genannten Code, sieht man die eingegebene Zahl nicht, was auch zur Verwirrung führen könnte, bei den Anfängern^^

    Wie du sagst, hat er rein in C gecoded, der Fehler ist er denkt das es in C++ ist laut Angabe :P

    @TE
    (Nicht böse gemeint aber man sollte schon C++ und C unterscheiden können ;) )

    C-Quellcode

    1. #include <iostream>
    2. #include <cstdlib>
    3. #include <stack>
    4. int main(int argc, char** args)
    5. {
    6. int max( 100 ), min ( 1 ), zahl ( ( rand( ) % max ) + min ), eingabe ( 0 );
    7. std::stack< int > eingaben;
    8. std::cout << "Mach was du willst zwischen " << min << " und " << max << "." << std::endl;
    9. while ( zahl != eingabe )
    10. {
    11. std::cin >> eingabe;
    12. eingaben.push( eingabe );
    13. std::cout.seekp( -1, std::ostream::cur );
    14. std::cout.put( ' ' );
    15. std::cout.flush( );
    16. if ( eingabe > zahl )
    17. std::cout << "ist groesser als meine Zahl." << std::endl;
    18. else if ( eingabe < zahl )
    19. std::cout << "ist kleiner als meine Zahl." << std::endl;
    20. if ( eingabe == zahl )
    21. std::cout << "ist meine Zahl. Hurra ..." << std::endl << "Nur fcking " << eingaben.size( ) << " Versuche." << std::endl; // Wer bock hat hat jetzt alle Eingaben im Stack auszugeben... bitte
    22. }
    23. return 0;
    24. }
    Mit fstream's funtioniert das. Nur doof das die Konsole nicht neu buffert.
    @Mangafreak1995: Da kann ich Zahlen eingeben wie ich will aber ne Antwort kommt nich...

    @Chrisber: Hab jetzt folgenden Code:
    Klicken um den Code anzuzeigen

    C-Quellcode

    1. /* hallo.c */
    2. #include <stdio.h>
    3. #include <iostream>
    4. #include <cstdlib>
    5. #include <string>
    6. #include <time.h>
    7. #include <windows.h>
    8. #include <winuser.h>
    9. #include <conio.h>
    10. using namespace std;
    11. void gotoxy(int x,int y){
    12. COORD c={x,y};
    13. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
    14. }
    15. int main(void) {
    16. srand(time(NULL));
    17. int min = 1;
    18. int max = 100;
    19. int mynumber = rand() %max+min;
    20. int entered, i;
    21. int x;
    22. int count = 0;
    23. printf("Ich denke mir eine Zahl zwischen %i und %i und du musst sie erraten!\n", min, max);
    24. // printf("%i\n", mynumber);
    25. for(i=0; i < 8000; i++) {
    26. scanf("%d",&entered);
    27. fflush(stdin);
    28. if (entered > mynumber)
    29. {
    30. MoveCursorRelative(0,1); //das ist Zeile 44
    31. printf("%i ist groesser wie meine Zahl!\n", entered);
    32. count++;
    33. }
    34. else if (entered < mynumber)
    35. {
    36. // gotoxy(0,1);
    37. printf("%i ist kleiner wie meine Zahl!\n", entered);
    38. count++;
    39. }
    40. else {
    41. // gotoxy(0,1);
    42. printf("%i ist meine Zahl! Richtig!\n", entered);
    43. printf("Du hast nur %i Versuche gebraucht!\n", count + 1);
    44. scanf("%d",&entered);
    45. return count;
    46. }
    47. }
    48. scanf("%d",&x);
    49. return 0;
    50. }
    51. bool MoveCursorRelative(int xOffset, int yOffset)
    52. {
    53. CONSOLE_SCREEN_BUFFER_INFO conInfo;
    54. HANDLE conOut = GetStdHandle(STD_OUTPUT_HANDLE);
    55. if (conOut == INVALID_HANDLE_VALUE)
    56. {
    57. return false;
    58. }
    59. if (!GetConsoleScreenBufferInfo(conOut, &conInfo))
    60. {
    61. return false;
    62. }
    63. COORD cursorLoc;
    64. cursorLoc.X = conInfo.dwCursorPosition.X + xOffset;
    65. cursorLoc.Y = conInfo.dwCursorPosition.Y + yOffset;
    66. if (!SetConsoleCursorPosition(conOut, cursorLoc))
    67. {
    68. return false;
    69. }
    70. return true;
    71. }

    doch leider sagt er mir beim erstellen in Zeile 55 "error C3861: "MoveCursorRelative": Bezeichner wurde nicht gefunden." obwohl die funktion doch existiert??!
    Bitte lerne schnleunigst nach einem guten Tutorial oder nach einem Buch...
    Dein Code ist ziemlich "müllig" und unsicher - auch wenn es hart klingt...

    Die Funktions-Implementierung musst du über die main-Funktion schreiben, sonst kann er diese nicht kennen. Eine Alternative ist die Deklaration eines Prototypen.
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    bitte nicht, wenn wir für jeden Scheiß die WinAPI nehmen würden, könnten wir hier nicht posten, weil es dann noch keine gescheiten Server geben würde....

    Einfach die Standardlibs nutzen, wo es geht..
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Einfach die Standardlibs nutzen, wo es geht..
    Kenn mich zwar nicht wirklich gut in den Standartlibs aus aber muss sagen hab auch noch nie von so einem Feature gehört. Außerdem läuft das ja auch Win und Linux ... vll. gibts Mac sowas auch.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    jvbsl schrieb:

    Einfach die Standardlibs nutzen, wo es geht

    Sorry aber du Redest hier Müll... C++ kennt keine Konsole und hat somit auch keine Standardlib für so etwas... Meine Lösung sollte ebenfalls funktionieren. Ich weiß nicht, wo das Problem liegt.
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.
    1. Dachte ich es geht hier um C
    2. Standardlibs gibts sogesehen schon(für C++ die von C verwenden(devil) ) und ganz einfach die, die über nen normalen Compiler auf alles normalen OS funktionieren, stlib, iostream, stdio usw. sind ja schon extra ähnlich...Klar ist nen CrossCompiler von nöten, aber das ist nunmal das schlauste.

    Außerdem läuft das ja auch Win und Linux ... vll. gibts Mac sowas auch.
    Mit WinAPI ganz sicher ned...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl: Was redest du? Ich habe nie bestritten, dass es Standardlibs gibt. Ich habe nur gesagt, dass C / C++ (völlig irrelevant) keine Konsole kennt. Nur Streams bzw. Ein- und Ausgabe. Man kann STDIN, STDOUT und STDERR nicht umsonst frei wählen...
    Wenn man sich bei sowas auf Hacks mit Standardlibs einlässt, hat man zu erwarten, dass es auf jedem System anders funktioniert, da es einfach undefiniertes Verhalten erzeugt. Eine für das jeweilige System angepasste Lösung ist an dieser Stelle besser...
    To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

    At some point in time, you recognize that knowing more does not necessarily make you more happy.

    jvbsl schrieb:

    Außerdem läuft das ja auch Win und Linux ... vll. gibts Mac sowas auch.
    Mit WinAPI ganz sicher ned...
    Wer lesen kann ist klar im Vorteil. Ich habe extra die Win und die Linux API's gepostet und diese sind auch auch im Code drinnen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.