Klausuraufgabe



  • _matze schrieb:

    Super fricky, so lernt er bestimmt was dabei...

    keine angst, mein vorschlag tut vielleicht nicht genau das, was er will. und wenn er sich damit auseinandersetzt, lernt er nebenbei doch was.
    🙂



  • if(ziel[strlaenge-1]!=' '){
            ziel[strlaenge-1]=' ';
            strlaenge++;
        }
    

    Bin nicht sicher, daß Du da triffst. Vielleicht eher

    if(ziel[strlaenge-1]!=' '){
            ziel[strlaenge]=' ';
            strlaenge++;
        }
    
    ziel[strlaenge-1]=trenn;               //Mit dieser Zeile hängt der Compiler
        strlaenge++;
    cout<<strlaenge;
    

    Das cout<< da geht gar nicht. Es will ausgeben bis zum '\0', aber Du hast noch keins geschrieben, um den String abzuschließen.

    for(int i=0;quelle[i]=='\0';i++){
    }
    

    Solange quelle[i] gleich '\0' ist?
    Nee, grad falschrum. In C++ gibt es keine Abbruchbedingungen, sondern nur Laufbedingungen.



  • ;fricky schrieb:

    _matze schrieb:

    Super fricky, so lernt er bestimmt was dabei...

    keine angst, mein vorschlag tut vielleicht nicht genau das, was er will. und wenn er sich damit auseinandersetzt, lernt er nebenbei doch was.
    🙂

    Na ich bezweifle, dass er das Zeiger-inkrementieren überhaupt kennt (und somit versteht). Er ist sicher besser mit seiner Zähler-Variante bedient. Aber einen (für ihn fiesen) Stolperstein hast du wirklich dringelassen. 😉



  • _matze schrieb:

    Aber einen (für ihn fiesen) Stolperstein hast du wirklich dringelassen. 😉

    Der kam sicher beim Zurückfrickeln von

    while (*d++ = *s++);// den rest anhaengen
    


  • _matze schrieb:

    Na ich bezweifle, dass er das Zeiger-inkrementieren überhaupt kennt (und somit versteht). Er ist sicher besser mit seiner Zähler-Variante bedient.

    ach mist. egal, kann ja nicht verkehrt sein, sich sowas auch mal anzugucken. eine musterlösung für seine hausaufgabe wollt ich nun auch garnicht posten.

    _matze schrieb:

    Aber einen (für ihn fiesen) Stolperstein hast du wirklich dringelassen.

    ja, da fehlt noch was.
    🙂



  • Das Problem ist er gibt mir nicht wirklich einen Fehler im Code aus. Der Code von ;fricky verhält sich allerdings genau wie meiner, es kommt also auch zu keiner Ausgabe.

    Was der Compiler mir anzeigt ist:
    The Debugger has exited due to signal 10 (SIGBUS).The Debugger has exited due to signal 10 (SIGBUS).



  • c++-user schrieb:

    Das Problem ist er gibt mir nicht wirklich einen Fehler im Code aus. Der Code von ;fricky verhält sich allerdings genau wie meiner, es kommt also auch zu keiner Ausgabe.

    mach mal in meinen code vor das 'return ret' ein '*d = 0' oder bau die zeile von volkard ein. und falls es dann gehen sollte, denk dran: nicht als hausaufgabe abgeben bevor du nicht verstanden hast, was der code macht.
    🙂



  • 1. Lies dir doch mal alle Beiträge seit gestern ganz genau durch, da findest du schon mal einige Hinweise.

    2. Nutze den Debugger! Der bietet dir so tolle Sachen wie Breakpoints zu setzen, schrittweise durch das Programm zu gehen, Variableninhalte auszugeben usw. So kommt man normalerweise ganz schnell auf den Fehler.

    3. Poste danach noch mal deinen aktuellen Code plus Fehlerbeschreibung (wenn noch Fehler da sind).


  • Mod

    Ich sehe noch ein gravierendes problem in ;frickys Code.
    Oder sagen wir anders. Es gibt zwei Probleme.
    1. Problem betrifft Zeile 6
    2. Problem betrifft Zeile 9+10



  • Zeile 6 ist klar, aber in Zeile 9-10 sehe ich kein Problem... 😕

    EDIT: Du meinst nicht die fehlende, terminierende Null, oder?


  • Mod

    _matze schrieb:

    EDIT: Du meinst nicht die fehlende, terminierende Null, oder?

    Ja!



  • Eine grundlegende Frage noch, dann sollte es eigentlich klappen:
    Ich rufe die Funktion auf:

    strcpy(str,strcatTrenn("h","string",'*'));
    

    Nun soll zu Testzwecken mein "Ziel" einfach einen anderen Wert bekommen und zurückgeben:

    char *strcatTrenn(char *ziel,const char*quelle,char trenn){
        ziel[0]='D';
        return ziel;
    

    Dieses führt wieder zum Fehler:

    The Debugger has exited due to signal 10 (SIGBUS).The Debugger has exited due to signal 10 (SIGBUS).
    


  • c++-user schrieb:

    Ich rufe die Funktion auf:

    strcpy(str,strcatTrenn("h","string",'*'));
    

    Wer hat dir denn gesagt, dass du das so machen sollst??

    Nochmal: du willst etwas an einen String anhängen. Daher muss auch genügend Platz für diesen String bereitstehen. Du kannst also nicht einfach "h" (Stringliteral mit 2 Zeichen Länge) an deine Funktion übergeben. Du musst den String vorher erzeugen und dabei genug Speicher reservieren (ansonsten schreibst du ins Nirwana). Das machst du am einfachsten, indem du dich an mein strcpy-Beispiel auf Seite 2 hältst (ich verstehe nicht, warum du das ignorierst). Dein Code hier ist vollkommen sinnlos und zeigt, dass du leider nicht verstehst, was du da machst.

    Kleiner Tipp: du brauchst die Rückgabe deiner Funktion nicht zu verwenden! Mach dich mal schlau, was eine Parameterübergabe per Wert (by-value) und per Referenz (by-reference) bedeutet. Wikipedia ist eine Möglichkeit.



  • Vielen Dank für die Hilfe, habs jetzt hinbekommen. Für die Klausur hätte mein bereits geposteter Kram sicher ein paar Punkte gebracht, wird ja alles schriftlich gemacht, hätt also meine Funktion nicht aufrufen müssen.

    Danke nochmal

    #include <iostream>
    using namespace std;
    
    char *strcatTrenn(char *ziel,const char*quelle,char trenn){
    int strlaenge=0;
    
        while(ziel[strlaenge]!='\0'){
            strlaenge++;
        }
    
    	while(ziel[strlaenge-1]==' '){
            strlaenge--;
        }
    
    	if(ziel[strlaenge]!=' '){
            ziel[strlaenge]=' ';
        }
    	strlaenge++;
    
    	ziel[strlaenge]=trenn;
    	strlaenge++; 
    
    	for(int i=0;quelle[i]!='\0';i++){
        ziel[strlaenge]=quelle[i];
        strlaenge++;
    	}
    
        ziel[strlaenge]='\0';	
    
        return ziel;
    
    } 
    
    int main () {
    char str[256];
    strcpy(str,"h");
    cout<<strcatTrenn(str,"string",'*');
    return 0;
    }
    

  • Mod

    Dein Code ist falsch wenn, der Eingabestring leer ist!

    Bufferunderflow!



  • Tu mir (abgesehen von Martins Einwand) noch einen Gefallen und rücke die for-Schleife vernünftig (bzw. überhaupt) ein. Bei den restlichen Schleifen und Verzweigungen hast du es ja auch gemacht.



  • Ja in der Klausur kommt auch nicht so drauf an ob die Einrückung stimmt ist ja handschriftlich. Aber ansonsten haste recht.



  • @Martin Richter
    Wenn der String Leer ist funktioniert es auch.



  • c++-user schrieb:

    @Martin Richter
    Wenn der String Leer ist funktioniert es auch.

    Nein! Wenn der String leer ist, bleibt strlaenge auf 0 und du fragst in der 2. while-Schleife ziel[0-1] ab. Das ist logischerweise außerhalb des gültigen Bereichs...



  • Stimmt, hat den Compiler aber nicht gestört. Vll ists ja so richtig:

    char *strcatTrenn(char *ziel,const char*quelle,char trenn){
    int strlaenge=1;
    
        while(ziel[strlaenge]!='\0'){
            strlaenge++;
        }
    	strlaenge--;			//Da Zählung von 0
     	while(ziel[strlaenge]==' '){
            strlaenge--;
        }
    
    	if(ziel[strlaenge+1]!=' '){
            ziel[strlaenge+1]=' ';
        }
    	strlaenge++;
    
    	ziel[strlaenge+1]=trenn;
    	strlaenge++; 
    
    	for(int i=0;quelle[i]!='\0';i++){
        ziel[strlaenge+1]=quelle[i];
        strlaenge++;
    	}
    
        ziel[strlaenge+1]='\0';	
    
        return ziel;
    
    }
    

Anmelden zum Antworten