C String umdrehen und dann vergleichen

0wN3r

Cadet 3rd Year
Registriert
Dez. 2008
Beiträge
56
hi, wir haben zur hausübung einen string einzugeben, den dann umzudrehen und wenn der gleich dem ursprünglichen ist (palindrom) dann soll eine entsprechende meldung ausgegeben werden.

nun bin ich mal so weit das ich zwei strings vergleiche, aber weiß jetzt nicht wie ich einen umdrehen soll.
wir müssen alles mit zeiger machen.

hier strings vergleichen:

Code:
#include <stdio.h>
#include <stdlib.h>

int strcmp(char [], char []);		// Prototyp

void main()
{
	char feld1[100];				// Feld1.
	char feld2[100];				// Feld2.
	char *p1 = feld1;				// Zeiger auf Feld1.
	char *p2 = feld2;				// Zeiger auf Feld2.

	printf("Geben sie den ersten String ein: \n");
	gets(feld1);
	printf("Geben Sie den zweiten String ein: \n");
	gets(feld2);

	printf("%d\n", strcmp( feld1, feld2));		//Funktionsaufruf.

	system("PAUSE");

}


int strcmp(char f1[], char f2[])
{
	char *z1 = f1;					// Zeiger auf Feld1.
	char *z2 = f2;					// Zeiger auf Feld2.

	while(*z1 != '\0' || *z2 != '\0')	// Bis ein String zuende
	{
		if(*z1 != *z2)				// Wenn Zeichen nicht gleich
			return -1;				// -1 zurueckgeben.
		
		++z2;						// Adresse erhoehen.
		++z1;						// Adresse erhoehen.
		
	}

	return 1;			// Wenn gleich, 1 zurueckgeben.

}
würd mich freuen wenn mir jemand hilft

lg
 
Hi,

erstmal eine Frage: Müsst ihr den String wirklich umdrehen, oder reicht es wenn du Element mit Element[N-i] vergleichst, wobei i die aktuelle Position und N die Länge des Strings ist?
Das wäre übrigens auch ein Ansatz mit dem man den String wirklich "umdrehen" kann...

/edit
Huups, falsche Index-Reihenfolge und bei C würde dann auch noch ein -1 fehlen...
 
Zuletzt bearbeitet:
Gewöhn dir gleich mal das gets() ab und nimm fgets(). Mit gets() kann der User über die Länge des char-Arrays hinausschreiben (also mehr als 100 Zeichen eingeben!) was sehr gefährlich sein kann.

Ansonsten würde ich auch sagen, dass man einfach im Array erstes und letztes Zeichen, zweites und vorletztes usw. vergleicht. Man muss dann nur ne Fallunterscheidung mache, da man bei ungerader Stringlänge das mittlere Zeichen ja nicht vergleichen kann/darf.

Umdrehen würde natürlich auch gehen, in etwa so:
Code:
char[] feld3 = new char[100];
int len = strlen(feld2);
for(int i = len-1; i > -1; --i){
    feld3[len-i-1] = feld2[i];
}
feld3[len] = '\0';
Ohne feld3 würds notfalls auch gehen (dann kann man aber gleich direkt vergleichen, siehen Anfang meines Posts) aber so ists wesentlich einfacher. Wenns unbedingt sein muss kannst es auch mit Pointern bauen. So in etwa (kann sein, dass was ned 100% stimmt und du z.B. irgendwo noch -1 oder +1 brauchst):
Code:
char[] feld3 = new char[100];
char *z2 = feld2 + strlen(feld2)-1;
char *z3 = feld3;
for(int i = strlen(feld2)-1; i >-1 ; --i){
    z3 = z2;
    --z2;
    ++z3;
}
feld3[len] = '\0';
Anschließend dann halt ein strncmp() laufen lassen (oder halt deine selbstgebaute Variante).

Edit:
Ähm eigtl. muss der User bei nem Palindrom doch eh nur 1 String eingeben, was willst du da mit 2? Hast du die Aufgabenstellung evtl. falsch verstanden?
Angenommen das Palindrom ist in feld1, so könnte man das wohl in etwa so auf ein Palindrom testen (ungetesteter Code):
Code:
char *z2 = feld1 + strlen(feld1);
char *z1 = feld1;
while(z1 != z2 && z1 < z2){       // ungleich ist wichtig weil das Abbruchkriterium bei ungerader Länge ist!
    if(*z1 != *z2) return -1;
    ++z1;
    --z2;
}
return 1;
 
Zuletzt bearbeitet:

Ähnliche Themen

T
Antworten
10
Aufrufe
11.860
Zurück
Oben