Wo liegt der Fehler



  • Hi,

    bitte gebt mir mal einen Tip, weshalb das folgende Programm nicht vernünftig arbeitet.
    Es soll einzelne Wörter spiegeln: "Erstes Wort 123" --> "setsrE troW 321"

    Der Fehler (es werden unverständliche Zeichen ausgegeben) muss mit dem Umgang meiner Pointer zu tun haben.
    Ich habe die Zeile mit mehreren Sternen markiert.
    Ich erkläre mir Zeiger allgemein wie folgt:

    void swap(int *num1, int *num2) {
    	int myval;
    
    	// Übergeben des Wertes *num1 an die temporäre Variable myval;
    	myval = *num1;
    	// Überschreiben der Adresse von "num1" mit dem Wert der Adresse von "num2";
    	*num1 = *num2;
    	// In die Adresse von "num2" wird nun der Wert von myval geschrieben.
    	*num2 = myval;
    }
    

    Ist das Richtig?

    Und nun der Code, welcher nicht funktioniert:

    #include <stdio.h>
    #include <string.h>
    
    void invStr(char *str1) {
    	int j;
    	int i=0;
    	int l_mark=0;
    	int h_mark=0;
    	int w_len;
    
    	char tmp; // ** Hier liegt der Fehler!
    
    	do  {
    
    		printf("> Buchstabe: <%c>, ASCII: <%d>, i=%d\n", str1[i], (int) str1[i], i);
    		if (((int) str1[i] == 32) || ((int) str1[i] == 0)) {
    			// Suche bis zum nächsten Leerzeichen
    			if (l_mark > 0) {
    					l_mark = h_mark + 2;
    			} else {
    					l_mark = 0;
    			}
    
    			h_mark = i-1;
    			w_len = h_mark - l_mark;
    			j = 0;
    
    			printf("Lmark: %d\n", l_mark);
    			printf("----------------------------------------------\n");
    			while (j+l_mark < (h_mark - j)) {
    				printf("> Buchstabe: <%c>, InvBuchstabe: <%c>\n", str1[l_mark + j], str1[h_mark -j]);
    
    				tmp = str1[l_mark + j];              // ** Hier liegt der Fehler!
    				str1[l_mark + j] = str1[l_mark - j];  // ** Hier liegt der Fehler!
    				str1[l_mark - j] = tmp;               // ** Hier liegt der Fehler!
    
    				j++;
    			}
    			l_mark=h_mark+1;
    		}
    		i++;
    	} while ((int) str1[i-1] != 0);
    
    }
    
    void main(void) {
    	char l_input[70];
    
    	printf("------------------- Text-Kodierung --------------------\n");
    	printf("Das folgende Programm wird einen Satz von Ihnen kodieren.\n");
    	printf("Bitte geben Sie nun einen Satz ein, der max. 70 Zeichen lang ist.\nSatz: ");
    	gets(l_input);
    
    	// Funktion zum Einlesen einer Zeichenkette, die auch Leerzeichen enthalten darf.
    
    	if (strlen(l_input) <= 70) {
    		printf("\nEingabe: <%s>\n", l_input);
    		printf("> Inversion wird durchgefuehrt.\n\n");
    		invStr(l_input); // ** Hier liegt der Fehler!
    		printf("\n- Die Kodierung wurde abgeschlossen und ergab folgendes Ergebnis:\n<%s>\nDas Programm wurde erfolgreich beendet.\n\n\n", l_input);
    	} else
    	{
    		printf("-------------------------------------------------------------\n");
    		printf("\nIhre Eingabe war zu lang.\nBitte wiederholen Sie den Vorgang.\n");
    	}
    }
    

    Vielen Dank.



  • Die Komentare sind falsch!
    1 ist richtig
    2 ist falsch richtig die Daten von mum2 werden nach num1 kopiert
    3 ist falsch richtig die Daten (Werte) aus myval werden anch num2 kopiert.
    Hier werden keine Adressen sondern Daten behandelt!!!

    void swap(int *num1, int *num2) { 
        int myval; 
    
    // 1    // Übergeben des Wertes *num1 an die temporäre Variable myval; 
        myval = *num1; 
    // 2    // Überschreiben der Adresse von "num1" mit dem Wert der Adresse von "num2"; 
        *num1 = *num2; 
    // 3    // In die Adresse von "num2" wird nun der Wert von myval geschrieben. 
        *num2 = myval; 
    }
    

    PS für dein anderes Problem es gibt debugger, Nimm dir einen einfachne Text z.B. "1a2b3c asdf" und step deine Funktion mal durch.



  • Hi,

    erst einmal Danke für den ersten Hinweis.
    Bitte führe mal meinen Code bei Dir aus. Der Code an sich stimmt. Hab es nämlich schon mal richtig laufen lassen.
    Ich habe aber an den Paramtern für meine Pointer bzw Werteübergabe herumgespielt.
    Deshalb denke ich nicht dies mit dem Debugger so leicht finden zu können.

    Vielen Dank.
    G*

    P.S.:

    Wieso muss ich der Wert an die Funktion in der folgenden Art und Weise übergeben werden? -->invStr(l_input);
    An die Funktion soll doch eine Referenz übergeben werden. Dies würde für mich invStr(&l_input); bedeuten. Dies führt aber zu einem Fehler



  • Der Begriff Referenz kommt aus C++ ist hier falsch.

    Da
    char l_input[70];

    eine Pointerdefinition ist wird hier eh der Pointer übergeben und der Adressoperator ist unnötig



  • was geht denn nicht, bitte eine etwas bessere Fehlermeldung


Anmelden zum Antworten