char pointer



  • Hallo, ich habe folgende Aufgabe:

    - Ich soll eine feste Zeichenkette drehen...

    Mein Problem ist: Die einzelnen Zeichen kann ich nicht raus lesen mit einem Pointer obwohl der Zeiger auf die richtige Adresse zeigt.

    int main(int argc, char* argv[])
    {
    	char* sNormal = "Hallo-Test";
    
    	printf("\n\n");
    	printf(" String: %s\n", sNormal);
    	printf(" Lenght: %d\n", GetStringLenght(sNormal));
    	printf(" Adress: %#x\n", &sNormal);
    	rotate_string(&sNormal);
    	//printf(" String: %s\n", sNormal);
    	return 0;
    }
    
    int GetStringLenght(char* sString)
    {
    	int nLenght;
    	for(nLenght = 0; sString[nLenght] != '\0'; nLenght++);
    	return nLenght;
    }
    
    void rotate_string(char** sString)
    {
    	//char sTemp[GetStringLenght(sString)];
    	printf(" Adress: %#x\n", sString);
    
    	while(*sString != '\0')
    	{
    		printf("%s", sString);
    		sString++;
    		nCount++;
    	}
    	printf("\n");
    
    }
    

    Hoffe, dass ihr mir eine Erklärung geben könnt, wie ich das machen kann...



  • Du hast bei rotate_string einen Doppelzeiger (**). Das ist ein Zeiger auf einen Zeiger auf char.

    In deiner while-Schlefe dereferenzierst du aber nur einmal. Darum hast du bei dem *sString einen Zeiger und kein char.

    Der Doppelzeiger ist auch gar nicht nötig. Lass in weg. (und die Adressoperatoren beim Aufruf auch).

    Der Formatspecifier zur Ausgabe eines Pointer ist %p (Zeile24)

    Du wirst allerdings keinen Erfolg mit deiner Zeichenkette haben, da dein Zeiger sNormal auf ein Stringliteral verweist. Und die sind nur zum lesen da.
    Mach ein Array daraus und dann passt das auch:

    char sNormal[] = "Hallo-Test";
    


  • Hi, Danke für den Tip, der String wird jetzt gespiegelt...nun eigentlich müsste ich ja den gespiegelten Text wieder an die Main funktion so übergeben können

    *sString = *sRotatetString;
    

    aber er wird in der Main Funktion immer noch normal angezeigt. 😕 😕

    #include <stdio.h>
    
    int main(int argc, char* argv[])
    {
    	char sNormal[11] = "Hallo-Test";
    
    	printf("\n\n");
    	printf(" String: %s\n", sNormal);
    	printf(" Lenght: %d\n", GetStringLenght(sNormal));
    	printf(" Adress: %#x\n", &sNormal);
    	rotate_string(&sNormal);
    	printf(" --------------------------------------\n\n");
    	printf(" String: %s\n", sNormal);
    	return 0;
    }
    
    int GetStringLenght(char* sString)
    {
    	int nLenght;
    	for(nLenght = 0; sString[nLenght] != '\0'; nLenght++);
    	return nLenght;
    }
    
    void rotate_string(char* sString)
    {
    	printf(" Adress: %#x\n", sString);			// Adresse ist OK
    	int nCount = 0;
    
    	char sRotatetString[11];
    
    	while(*sString != '\0')
    	{
    		sString++;
    		nCount++;
    	}
    	sString--;
    
    	int i = 0;
    	for(i = 0; i< nCount; i++)
    	{
    		sRotatetString[i] = *sString;
    		sString--;
    	}
    
    	// sRotatetString zeigt die Zeichenkette gespiegelt an
    	printf("\n %s\n", sRotatetString);
    
    	*sString = *sRotatetString;			// Wie kann ich den Wert von sString überschreiben, damit es in der Main funktion auch gepsiegelt
    										// ausgibt???
    
    }
    

    Ausgabe:

    String: Hallo-Test
    Lenght: 10
    Adress: 0x28ff05
    Adress: 0x28ff05

    tseT-ollaH
    --------------------------------------

    String: Hallo-Test



  • Dafür ist strcpy da.



  • Mit Pointe sollte das doch auch gehen Call By referenc



  • Da kannst du den Inhalt ändern auf den der Zeiger zeigt aber nicht wohin er zeigt.



  • DirkB schrieb:

    Da kannst du den Inhalt ändern auf den der Zeiger zeigt aber nicht wohin er zeigt.

    Oh vielleicht habe ich mich falsch ausgedrückt. ..ich möchte den Inhalt ändern von sNormal. Ohne strcpy nur durch den Funktions Aufruf



  • Du schreibst den geänderten Inhalt erst mal lokal in sRotatetString. Das ist ja auch ok. sRotatetString ist quasi deine Hilfsvariable. Nun solltest du das Ergebnis aber auch dahinkopieren, wo du es haben willst (sRotatetString => sString). Und dafür sollst du strcpy nehmen.

    Übrigens: sofern der String garantiert nullterminiert ist, kannst du den letzten Index (die Länge) auch mit strlen ermitteln. Dann sparst du dir die erste Schleife. Oder du gibst der Funktion die Länge gleich mit.



  • Du kannst dir auch dein eigenes strcpy schreiben, so wie du auch ein eigenes strlen gemacht hast.

    Allerdings kannst du auch gleich deine Änderungen in sString vornehmen.
    Dann brauchst du das sRotatetString nicht und kannst so belibieg lange Texte umdrehen.



  • #include <stdio.h>
    
    size_t strlen( char const *str )
    {
    	size_t len = 0;
    
    	if( !str )
    		return 0;
    
    	while( *str++ )
    		++len;
    
    	return len;
    }
    
    void swap( char * const a, char * const b )
    {
    	char tmp = 0;
    
    	if( !( a && b ) )
    		return;
    
    	tmp = *a;
    	*a = *b;
    	*b = tmp;
    }
    
    char* reverse( char *beg, char *end )
    {
    	char *str = beg;
    
    	if( !( beg && end ) )
    		return 0;
    
    	--end;
    
    	if( !*end )
    		--end;
    
    	while( beg < end )
    		swap( beg++, end-- );
    
    	return str;
    }
    
    int main( void )
    {
    	char text[] = "Hello, World!";
    
    	puts( text );
    	puts( reverse( text, text + strlen( text ) + 1 ) );
    }
    

Log in to reply