C Anfängerproblem: Spiegeln eines Wortes mit Zeigern

Status
Für weitere Antworten geschlossen.

Ripl3ys

Newbie
Registriert
Dez. 2014
Beiträge
3
Guten Abend,
vorweg: ich bin ein ziemlicher newbie was programmieren angeht.
Meine Aufgabe lautet:
"Schreiben Sie ein Programm, das ein eingegebenes Wort im Speicher
spiegelt. Beispiel: Ist das Wort ”
Welt“ eingegeben worden, so soll am Ende
die Zeichenkette ”
tleW“ im Array stehen. Nutzen Sie zur Manipulationen
ausschließlich Zeiger auf die einzelnen Elemente und keinen Indexzugriff."

Bisher hab ich mit Ach und Krach das hier zusammengekriegt:
Code:
#define N 5
#include <stdio.h>
int main () {

char *pointerA, A[N], B[N], *pointerB;
pointerA=&A[0] ;
pointerB=&B[N-1];
scanf("%s", pointerA);

while((pointerA<&A[N-1])&&(pointerB>=&B[0])){
	*pointerB=*pointerA;


	pointerA++;
	pointerB--;
}

printf("%s",pointerB);
return 0 ;
}

jetzt spuckt mir die Ausgabe zwar das Wort Welt gespiegelt wieder aus, aber mit seltsamen zusätzlichen Zeichen.
Könnte mir wer behilflich sein? Geht mir weniger um das fertige Programm, sondern dass ich verstehe was für fehler ich gemacht habe.
Danke schon mal :)
 
Hi,

wenn die Zeichen nach deinem invertierten Welt stehen liegt es evtl. daran dass am Ende eines strings immer ein '\0' (= der Wert 0 als Zahl) stehen muss.

Grüße
Tischbein
 
Hi,

Der Fehler könnte sein dass du das Char-Array "Welt\0" folgendermaßen kopierst: "\0tleW".

In deinem Fall müsstest du von 0 bis N-2 kopieren und dann auf die Addresse von Array-Item N-1 fix den Wert 0 bzw. "\0" hin schreiben da Strings immer mit 0 terminiert werden müssen.
 
Müsste das N-2 nicht dadurch schon erledigt sein, dass die Abbruchbedingung "echt kleiner" als &A[N-1] ist?
wenn ich die Bedingung auf
Code:
while((pointerA<&A[N-2])...
änder und am ende
Code:
B[N-1]="\0";
einfüge,
verschlimmert es sich anscheinend noch..
wenns hilft hier mal ein bild von dem problem:
Unbenannt.png
 
Du musst auch B entsprechend ändern, bisher wird in B {?, t, l, e, W} reinkopiert. Du willst aber {t, l, e, W, \0}.
Guck dir das nochmal an, dann kommst du schon drauf.
 
Habs jetzt, vielen dank! :) Hattet recht zeroflow und simpsonsfan, dazu kam dann noch, dass die schleife terminiert ist als der pointer auf &B[-1] stand und deswegen vor dem umgekehrten wort noch die sonderzeichen waren :)
 
Sollte nicht jeglicher Indexzugriff vermieden werden?
Für mich sind die Codezeilen 6, 7 und 10 indizierte Zugriffe.

Hier wäre als Beispiel ein Code welcher ohne Indexzugriff auskommt.

Code:
char word[N], mirrored_word[N];
scanf("%s", word);

char* pointerA = word; //startadresse des arrays word                          
char* pointerB = mirrored_word; //startadresse des arrays mirrored_word

//letzten buchstaben ermitteln
int word_length = 0;
for(int i = 0; i < N; i++)
{
	if(*pointerA == '\0')
	{
		//pointerA auf letzten gültigen Buchstaben zeigen lassen
		//falls wort leer ist und somit word_lenght 0 ist, 
		//zeigt pointerA zwar auf einen ungültigen speicher, wird aber beim spiegeln abgefangen
		pointerA--;
		word_length = i;
		break;
	}
	else
	{
		pointerA++;
	}
}

//wort spiegeln
for(int i = 0; i < word_length; i++)
{
	*pointerB = *pointerA;	
	pointerA--;
	pointerB++;
}

//string terminieren
*pointerB = '\0';

mfg slash
 
Zuletzt bearbeitet:
Wir sind aus gutem Grund kein Forum für Hausaufgabenhilfe. Bitte beachte in Zukunft die Regeln. Danke.
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben