Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » warum stürzt dieses Programm immer ab

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.05.2006, 12:17 Uhr
Poffelnator



Warum stürzt diese Programm immer ab. Habe jetzt nen paar Stunden versucht den Fehler mit dem Debugger zu finden, leider ohne Erfolg.


C++:
#include <iostream>        //suchen in iostream.h
#include <stdio.h>        //einbinden von stdio.h für Funktion "gets()"

using namespace std;    //nur namespace nutzen aus iostream.h für cin, cout


/*    deklaration der funktion zur Umformung des Satzes    */

void umformen (char[11]);    // ++++Array mit 100 Variablen vom Typ char übergeben++++

// Hauptprogramm (main)

int main ()
{
    char satz[11];                //daklaration Satzarray


            /*        Bildschirmausgabe        */

    cout<<"***************************************************************************"<<endl;
    cout<<"*Das nachfolgende Programm dreht jedes der von Ihnen eingegebenen Woerter!*"<<endl;
    cout<<"***************************************************************************"<<endl<<endl;
    cout << "Geben Sie den Satz mit maximal 101 Woertern ein: ";


/*    Einlesen des Satzes      */
    gets(satz);                    //in Array satz kopieren

    cout << "\n";
    umformen(satz);                //Funktionsaufruf zur Satzumformung
    cout<<"Umgeformt: "<<satz;    //Bildschirmausgabe des fertigen Satzes
    return 0;


}//Ende main


/*    definition der funktion umformen    */

void umformen (char*satz)        //Zugriff auf Array über Zeiger "*satz" vom typ char
{

    char help[11];                //hilfsarray help deklariert
    int anfang=0, ende=1;        //hilfsvariablen deklariert und initialisiert



    for (int i=0; satz[i]!=0; i++)    //satz in hilfsarray übertragen (Ende Schleife:letztes Zeichen des Array==0)
    {
        help[i]=satz[i];
    };



    for (int j=0; satz[j]!=0; j++)    //1.For: zum durchlauf des Satzes
    {
        for (i=anfang; satz[i]!=0x20 && satz[i]!=0; i++);    //2.For: leerzeichen suchen"0x20"ASCII-Code
        {                                                    //wenn leerzeichen gefunden i++ und zu For1
            ende=i;

            for (i=0; i < ende-anfang; i++)satz[anfang+i]=help[ende-i-1];    //3.For:umdrehen des wortes und anschl über i++ weiter
            {

                anfang=ende+1;

            };//3.For

        };//2.For

    };//1.For

    satz[ende]=0;
}// Ende umformen




Nachtrag:

Ich bin mir zwar nicht ganz sicher, ich glaube aber das die erste Schleife die Ursache ist. (Abbruchbedingung). Wie ich den Fehler jetzt beheben kann und wo genau er zum Tragen kommt kann ich einfach nicht finden. Die Funktion wird ja auch beendet und das Programm kann ja noch den Satz auf dem Bildschirm ausgeben.

Dieser Post wurde am 02.05.2006 um 12:36 Uhr von Poffelnator editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.05.2006, 12:59 Uhr
Poffelnator



Wie so oft, habe ich den Fehler mach dem Posten selber gefunden, nach dem ich den ganzen Vormittag mit verbracht habe. Mir ist aber noch nicht klar, warum das Programm erst nach Beendigung der Funktion abstürzt!?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.05.2006, 13:22 Uhr
mike
Pinguinhüpfer
(Operator)


Was mir nur schnell aufgefalle ist:
C mit C++ nicht mischen (stdio.h ...), in umformen 2te innere Schleife: i ist out of Scope
Wenn du unbedingt char verwenden willst, würde ich die erste For-Schleife durch strcpy austauschen (wo wird das benötigt?). gets ist zeimlich unsicher - probier mal fgets.
Überprüf auch noch mal die Verschachtelung der Schleifen
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.05.2006, 15:53 Uhr
0xdeadbeef
Gott
(Operator)



C++:
   gets(satz);


Diese Funktion NIEMALS benutzen. Was passiert ist, der User gibt mehr als 11 Zeichen ein, gets smasht den stack und alles mögliche kann passieren - in diesem Fall überschreibt gets vermutlich ne Rücksprungadresse auf dem stack oder so. Nimm fgets. Und mach satz etwas größer als 11 Zeichen. Und nebenbei, richtig heißt es in C++

C++:
#include <cstdio>


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.05.2006, 17:15 Uhr
Poffelnator



Das ein Satz in der Regel Länger ist als 11 Zeichen ist mir schon klar. Ich habe den Code von einem bekannten bekommen in der Hoffnung, dass ich den Fehler finden kann. Da ich dann das Programm mit einem Debugger auseinander nehmen wollte, habe ich das Array von 100 auf 11 Zeichen gesetzt.

Wie ich den Fehler behoben habe:


C++:
int helpvar = 0;

    for (int i=0; satz[i]!=0; i++)    //satz in hilfsarray übertragen
    {
        help[i]=satz[i];
        if(satz[i] == ' ')
        {
            helpvar++;
        }
    };

    



    for (int j=0; /*satz[j]!=0*/ j<=helpvar ; j++)    //1.For: zum durchlauf des Satzes
    {
        for (i=anfang; satz[i]!=0x20 && satz[i]!=0; i++);    
        {                                                    //wenn leerzeichen gefunden i++ und zu For1
            ende=i;

            for (i=0; i < ende-anfang; i++)satz[anfang+i]=help[ende-i-1];    //3.For:umdrehen des wortes und anschl über i++ weiter
            {

                anfang=ende+1;

            };//3.For

        };//2.For

    };//1.For




ich selber hätte es ein wenig anders gemacht:


C++:

while (schritt>=0)                            
        {
            schritt = satz.find_first_of(" ",index);  
            sub = satz.substr(index,schritt-index);  
            index = schritt +1;
            reverse(sub.begin(),sub.end());          
            cout << sub << " ";
        }




Ohne mich auf eignende Erfahrungen stützen zu können, versuche ich doch immer möglichst die Vermischung von c und c++ zu vermeiden, da ich schon des öfteren gehört habe das dies immer eine potenzielle Gefahrenquelle ist.

Dieser Post wurde am 09.05.2006 um 17:15 Uhr von Poffelnator editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.05.2006, 09:52 Uhr
0xdeadbeef
Gott
(Operator)


Meinste das so?

C++:
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

void umformen(string &satz);

int main() {
  string satz;

  cout << "***************************************************************************\n"
          "*Das nachfolgende Programm dreht jedes der von Ihnen eingegebenen Woerter!*\n"
          "***************************************************************************\n"
          "\n"
          "Geben Sie den Satz ein: " << flush;

  getline(cin, satz);

  cout << endl;

  umformen(satz);

  cout << "Umgeformt: " << satz << endl;

  return 0;
}

void umformen(string &satz) {
  string::iterator i = satz.begin(), j;

  do {
    j = find(i + 1, satz.end(), ' ');
    reverse(i, j);
    i = j + 1;
  } while(j != satz.end());
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.05.2006, 15:10 Uhr
Poffelnator



ja oder so.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: