Finde Fehler nicht!!!



  • Hy!!

    Ich war schon immer schlecht darin Fehler zu finden!! Besonders dann, wenn beim Debuggen keine Fehler angezeigt werden. Könnt ihr mir helfen die Fehler zu finden?

    Also das ist der Code:

    #include <stdio.h>
    
    void rotate(char* feld, int laenge, int schiebung)
    {
    	int i, j;
    	char a[30]={0};
    
    	for(i=0; i>laenge; i++)
    	{
    		feld[i]=a[30];
    		feld[i]=feld[i+schiebung];
    	}
    
    	for(j=i-schiebung; j>laenge; j++)
    	{
    	feld[j]=a[30];
    	}
    }
    
    int main()
    {
    	char feld[30];
    	int laenge;
    	int schiebung;
    	int position;
    
    	printf("Zeichenkette: ");
    	scanf("%[^\n]", &feld);
    
    	printf("Position: ");
    	scanf("%d\n", &position);
    
    	printf("Laenge: ");
    	scanf("%d\n", &laenge);
    
    	printf("Verschieben: ");
    	scanf("%d\n", &schiebung);
    
    	rotate(feld, laenge, schiebung);
    
    	printf("Ergebnis: %s", feld);
    
    }
    

    Und das ist die Angabe der Übung:
    1.Rotate
    Schreiben Sie ein Programm mit einer Funktion rotate, die ein 1-dimensionales Feld der Länge n um m Positionen rotiert, Die Anzahl der zu verschiebenden Positionen m kann größer als n bzw. positiv und negativ sein.

    Gehen sie von folgendem Funktionsprototyp aus:
    void rotate(char* feld, unsigned int laenge, int schiebung);

    Implementieren Sie die Funktion rotate, wobei der Parameter
    -feld ein Zeiger auf das zu verschiebende Feld ist
    -laenge die Länge des zu verschiebenden Bereichs angibt (der Bereich beginnt immer bei Index 0)
    -schiebung die Anzahl der Positionen angibt, um die verschoben werden soll

    In der folgenden Tabelle sind einige Beispiele für den Aufruf von rotate angegeben, wobei jeweils der Inhalt des Feldes „feld“ vor und nach Aufruf von rotate angegeben ist. Im Beispiel wird angenommen, dass das Feld mit: char feld[]=“abcdef“; initialisiert worden ist.

    zB:
    Feld vor Aufruf : abcdef
    Aufruf : rotate(feld,6,2)
    Feld nach Aufruf : efabcd

    Die Funktion rotate soll allgemein, d.h. für laenge>= 0 bzw. positves und negatives schiebung implementiert werden.
    Der String für das Feld und die Position, Länge und Anzahl der verschobenen Zeichen sollen vom Benutzer eingegeben werden können.
    Verwenden Sie für die Übergabe der Position zur Funktion rotate Pointer-Arithmetik.

    Beispiel:
    Zeichenkette: Ich find das toll!!
    Position: 4
    Länge: 8
    Verschieben: 3
    Ergebnis: Ich das find toll!!

    Ich sag jetzt schon, danke für die Hilfe

    Lg Doty



  • Wieso sollte der Debugger dir auch einen Fehler melden, wenn der Code formal richtig, in der Ausführen jedoch Schrott ist. Ein Übersetzungsprogramm verweigert ja auch nicht seinen Dienst, wenn du ihm inhaltlichen Stuss zum Übersetzen gibst. Ansonsten würd ich das mal so machen, habs aber nicht getestet

    void rotate(char* feld, int laenge, int schiebung){
    
    	int	i, position;
    	char	*feld2;
    
    	schiebung = schiebung%laenge;
    	if(schiebung == 0){
    		return;
    	}
    	feld2 = malloc(laenge);
    	memcpy(feld2, feld, laenge);
    	for(i = 0; i < laenge; i++){
    		position = i + schiebung;
    		if(position < 0){
    			position += laenge;
    		}else if(position >= laenge){
    			position -= laenge;
    		}
    		feld[i] = feld2[position];
    	}
    	free(feld2);
    }
    


  • Hallo zusammen,

    hier ganz deutlich, obgleich es effizienter geht.

    Grüße

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    
    void rotate(char* feld, unsigned int laenge, int schiebung) {
    	int i;
    	char *tmp;
    
    	/* Vorbedingung */
    	assert(abs(schiebung) <= laenge);
    
    	/* Hilfsfeld allokieren */
    	tmp = malloc(laenge); /* da sizeof(char)=1 */
    
    	/* Feld verschoben kopieren */
    	for (i = 0; i < laenge; ++i)
    		/* +laenge: da negative Schiebungen; % auf positiver Zahl (Vorbedingung) */
    		tmp[(i + schiebung + laenge) % laenge] = feld[i];
    
    	/* Zurueckkopieren und Hilfsspeicher freigeben */
    	memcpy(feld, tmp, laenge);
    	free(tmp);
    }
    
    int main(void) {
    	char s[] = "abcdef";
    	int n = sizeof(s) / sizeof(char) - 1;
    
    	rotate(s, n, 2);
    	printf("%s\n", s); /* efabcd; ok */
    
    	rotate(s, n, -4);
    	printf("%s\n", s); /* cdefab; ok */
    
    	return EXIT_SUCCESS;
    }
    


  • Nebenbei: Bitte aussagekräftigere Titel!

    Gute Nacht.


Anmelden zum Antworten