Stimmt was im Puffer nicht?



  • Hallo! 🙂

    Habe folgendes Programm geschrieben, um eine Liste von Namen einzulesen un ggf. alphabetisch auszugeben. Leider nimmt das Programm nach ANzeige der Optionen keine EIngabe mehr entgegen. Ich dachte erst, es liegt am Puffer - nach dem Säubern wurde es aber nicht besser.

    Bin blutiger Anfänger und arbeite mom. noch strikt nach Buch (Willms).
    Könntet ihr mir helfen und mir sagen, wo konkret der Fehler steckt?

    Vielen Dank für eure Hilfe!

    #include <iostream>
    #include <string.h>
    
    using namespace std;
    
    int main()
    {
        int i, j, k, opt;
        char namen[100][30], temp[30];
    
             do
             {
                         for(i=0; i<100; i++)
                                  for(k=0; k<30; k++)
                                           namen[i][k] = '\0';
    
                         cout << "Bitte bestätigen Sie jeden eingegebenen Namen mit <Enter>\n"
                                 "und beenden die Eingabe mit Strg-Z und <Enter>.\n\n";
    
                         for(i=0; i < 99 && (*namen[i-1] != EOF); i++)
                                  cin.getline(namen[i], 30 , '\n');
    
                         cout << "\nFolgende Optionen stehen Ihnen zur Verfügung:\n"
                                 "(1) Neue Liste eingeben\n"
                                 "(2) Liste unsortiert ausgeben\n"
                                 "(3) Liste alphabetisch sortiert ausgeben\n"
                                 "(4) Programm verlassen\n\n";
    
                         while(cin.get() != '\n')
                         cin >> opt;
    
                         switch(opt)
                         {
                                    case 2:
                                            for(i = 0; namen[i][0]; i++)
                                                  cout << namen[i] << "\n";
                                            cout << "\n\n";
                                            break;
    
                                    case 3:
                                            for(i = 0; namen[i][0]; i++);              // Bis erstes Nullzeichen-Feld scannen
    
                                            while(i+1)
                                            {
                                                  for (k = i; k + 1 > 0; k--)
                                                  {
                                                      if(strcmp(namen[i], namen[i+1]) > 0)
                                                      {
                                                               strcpy(temp, namen[i]);
                                                               strcpy(namen[i], namen[i + 1]);
                                                               strcpy(namen[i + 1], temp);
                                                      }   
                                                  }
    
                                                  i--;
                                            }    
    
                                            for(i = 0; namen[i][0]; i++)
                                                  cout << namen[i] << "\n";
                                            cout << "\n\n";
                                            break;
                         }
    
             }while(opt != 4);                            
    
             cout << "Auf Wiedersehen!\n\n";
             system("pause");
             return 0;
    }
    


  • Kein Wunder, STRG-Z schließt ja auch die Eingabe. Ich würde stattdessen eine Leerzeile verwenden.



  • Hui das geht ja fix hier 🙂 ich guck gleich mal, danke

    Hab jetz mal anstelle von EOF das Zeichen '@' verlangt - funktioniert leider dennoch nicht. Es werden zwar Eingaben entgegeben genommen, jedoch passiert zuerst nichts. Nach der 3. Eingabe einer Zahl soll ich dann eine neue Liste eingeben - unabhängig von meiner Auswahl 😞



  • Krieg's nicht gebacken :((



  • Hi!

    Dieser Vergleich kann nicht funktionieren:

    (*namen[i-1] != EOF)
    

    Beim ersten Zugriff müsste ist der Index -1. Du prüfst also die letzte Eingabe immer einmal zu spät (wenn du zur zweiten Eingabe kommst, prüfst du dort was in der ersten Eingabe stand). Du musst hier einfach [i] statt [i-1] verwenden. Das ganze kannst du ganz leicht im Debugger rekonstruieren mit diesem Snippet:

    char c[101][21] = {0};
    
    char last = ' ';
    for(int i = 0; *c[i-1]!='.'; ++i) {
      cin.getline(c[i], 20);
      last = *c[i-1]; // hier kannst du zusätzlich sehen das es nicht klappt
    }
    
    cout << last << endl;
    

    Außerdem ist es bestimmt nicht garantiert das ein Zugriff mit Index -1 funktionieren muss, da das normalerweise außerhalb des gültigen Bereichs liegt.

    Greetz


Anmelden zum Antworten