Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

Fehler bei Stringmanipulation in C++
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Informatik-Forum -> Fehler bei Stringmanipulation in C++
 
Autor Nachricht
KayB94
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 15.08.2013
Beiträge: 4

BeitragVerfasst am: 29 Okt 2013 - 22:07:37    Titel: Fehler bei Stringmanipulation in C++

Hallo miteinander,

ich habe ein Programm geschrieben, mit dem man eine Wörterbuch-Datei (von dict.cc) nach Vokabeln durchsuchen und diesen dann ausgeben kann.

Ich lese dafür zeilenweise ein. Die einzelnen Zeilen sehen so aus:
Zitat:

Deutsche Vokabel :: Englische Vokabel


Also suche ich nach der Position von "::" und möchte dann mit str.substr zwei Teilstrings machen. Der erste von 0 bis pos (das funktioniert einwandfrei), den zweiten dann von pos + 3 bis ende. Da erhalte ich beim Ausführen einen Error, Code 134 (Ubuntu).
Außerdem folgende Meldung:
Zitat:

terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr
Aborted (core dumped)

wenn ich nur bis pos + 1 mache, funktioniert es aber! Bzw. eigentlich läuft das Programm auch so durch, aber toll ist das ja nicht.

Hier der Code:
Code:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{

int x = 0, a = 0, b = 0, c = 0;
string line, de, en, voc;

cout << "Wort: ";
cin >> voc;

ifstream myfile ("/home/kay/dict.txt");

if ( myfile.is_open() ){

   while (x < 9)               // Header-Zeile überspringen
   {
      getline(myfile, line);       // Zeilenweise einlesen, Variable line
      x++;
   }

   x = 0;

   while ( getline (myfile,line) )    // während gelesen werden kann
   {
      x++;
      getline(myfile, line);         // einlesen
      
      a = line.find("::");         // Position des Trenzeichens
         
      de = line.substr(0, a);         // Teilstring in de von 0 bis a
      en = line.substr(a+3);         // Telistring in en ab a
      
      b = de.find(voc);
      c = en.find(voc);
      
      if (b != -1){               // falls gefunden, dann vokabel ausgeben (de)
         cout << de << endl << en << endl << endl;}
      else if (c != -1){            // falls gefunden, dann vokabel ausgeben (en)
         cout << en << endl << de << endl << endl;}
   }
   
   myfile.close();                  // datei schließen

}

else cout << "Unable to open file";      // wenn datei nicht geöffnet werden kann

return 0;
}


Wäre super, wenn mir jemand helfen kann!


Grüße, Kay
maze77
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.09.2012
Beiträge: 160

BeitragVerfasst am: 01 Nov 2013 - 09:11:37    Titel:

Hallo Kay,
ich habe mir die Datei heruntergeladen und dein Programm ausprobiert.
Die Fehlerursache ist ja klar: find gibt -1 zurück, und dein Programm kann damit nicht umgehen.

Einige kleine Hinweise zum Programmierstil:

statt

Code:
 a = line.find("::");         // Position des Trenzeichens

besser

Code:
posOfSepChar = line.find

Dann kann man sich den Kommentar sparen.
Analog für die Variablen b und c.

Der folgende Code

Code:
if (b != -1){               // falls gefunden, dann vokabel ausgeben (de)
          cout << de << endl << en << endl << endl;}
       else if (c != -1){            // falls gefunden, dann vokabel ausgeben (en)
          cout << en << endl << de << endl << endl;}


enthält Redundanzen; bestimmt kennst du ein Konzept, mit dem sich diese vermeiden lassen?

Die Zeile

Code:
x++;


verstehe ich nicht ganz: wozu brauchst du die?

Gruss maze77
Manicopus
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 09.09.2019
Beiträge: 64

BeitragVerfasst am: 13 Sep 2019 - 19:03:23    Titel:

Steuern sind immer noch die halbe Miete, viele wissen nicht, wie man einen Webshop erstellt. Ich kann Sie auf dieser Plattform beraten - https://de.supr.com/start/ . Billig und fröhlich.
Grinder
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 08.10.2019
Beiträge: 11

BeitragVerfasst am: 11 Okt 2019 - 12:45:54    Titel:

If you're planning technology and game production. Then I suggest that you look at the playground at https://ability-search.com/. Where a great example of how to make games can be found.
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Informatik-Forum -> Fehler bei Stringmanipulation in C++
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum