# [c]Zeichenkette umkehren



## Padawan (4. April 2011)

Hallo Leute,
hab ein Konsolenprogramm mit Codeblocks erstellt, dass ein im Programm vorgegebene Zeichenkette, Umgedreht bzw. umgekehrter Reihenfolge ausgeben soll.
Hier dass Programm:



```
#include <stdio.h>

int getTextlength(char *);
char reverseText(char *, char *);

int main()
{
    char Text1[50] = "Dies ist ein Text, der umgedreht werden soll!";
    char Text2[50] = " ";
    int TextLaenge = 0;

    printf("Urspruenglicher Text:\n%s\n\n", Text1);
    printf("Umgedrehter Text:\n%s\n\n", reverseText(Text1, Text2));

    return 0;
}

/**********************************************************
*reverseText
*Kehrt die zeichenkette der ersten Textes um.
*Parameter: Text1 und Text2
*Ergebnis: Der umgehkehrte Text
***********************************************************/
char reverseText(char *txt1, char *txt2)
{
	//deffinitionen
    int  laenge = 0;	//für die Textlänge
    int i, j;			//Zählvarialen

    //Zählen und übergabe der textlänge
    laenge = getTextlength(char *(txt1));

    //Umkehren des Textes
    for(i=0, j = laenge; i <= laenge, j >= 0; i++, j--)
    {
        *(txt2 + i) = *(txt1 - j);
    }

    return *txt2;
}

/**********************************************************
*getTextlength
*Ermittelt die Textlänge, due Umgekehrt werden soll.
*Parameter: Textlaenge, Text
*Ergebnis: Die gezählte Zeichenkette
***********************************************************/
int getTextlength(char* txt1)
{
	//Deffinitionen der Variablen
    int len;	//für den Anzhal der Buchstaben

	//Zählen der Buchstaben
    while(txt1 != '\0')	//solange nicht textende
    {
        len++;
    }
	len--;

    return len;
}
```

Bei mir kommen jedoch folgende Fehlermeldungen, die ich nicht lösen finden kann :-( :

|In function 'main':|
13|warning: format '%s' expects type 'char *', but argument 2 has type 'int'|
10|warning: unused variable 'TextLaenge'|
|In function 'reverseText':|
31|error: expected expression before 'char'|
34|warning: left-hand operand of comma expression has no effect|
||=== Build finished: 1 errors, 3 warnings ===|


Ich hoffe ihr könnt mir helfen.

Lg Padawan


----------



## posi90 (5. April 2011)

Hallo Padawan,

Die Fehler stehen im prinzip schon da.

Zeile 10: Kannst du einfach löschen, wird nicht verwendet.

Zeile 13: Die Funktion reverseText gibt einen Letter zurück, jedoch gibst du %s an, also für String. Schreibe die Funktion vor das Printf und als Parameter für das Printf gibst du Text2 an.

Zeile 31: Der Ausdruck für den Übergabeparameter ist völlig falsch, hier einfach txt1 reinschreiben oder du verwendest die Funktion strlen() in der string.h Bibliothek.

Zeile 34: Ist mir neu, dass der mittlere Wert einer for-Schleife 2 Vergleiche akzeptiert. Ansonsten seh ich hier keinen Fehler. Zeile 36 geht noch einfacher: 
	
	
	



```
txt2[i]=txt1[j];
```
 bei deiner Version solltest du noch das Minus vor dem j zu einem Plus ändern!

Hoffe ich konnte dir helfen.

Grüße


----------



## deepthroat (5. April 2011)

Hi.

Ein kleiner Fehler ist noch in Zeile 52. Die Variable len ist nicht initialisiert, hat also einen zufälligen Wert. Somit wird die Funktion auch einen zufälligen Wert zurückgeben.

Die Dokumentation für die Funktionen stimmen nicht bzw. sind "ungünstig" formuliert. Z.B. "Ergebnis: Die gezählte Zeichenkette" ist falsch. Es wird einfach die Länge des Strings zurückgegeben bzw. die Anzahl der Zeichen des Strings.

Gruß


----------



## Muepe32 (5. April 2011)

posi90 hat gesagt.:


> Zeile 34: Ist mir neu, dass der mittlere Wert einer for-Schleife 2 Vergleiche akzeptiert. Ansonsten seh ich hier keinen Fehler. Zeile 36 geht noch einfacher:
> 
> 
> 
> ...



Du kannst in jedem Teil des for-Kopfs einen Ausdruck angeben, dieser darf aber aus so vielen Vergleichen und Anweisungen bestehen wie du möchtest:

```
for(int i = 0; (i < foo && bar(i) != i) || (foo > i && bar(foo) == i); ++i, ++foo)
```

Wichtig ist hierbei, dass das , selbst auch Operator sein kann. Der , Operator führt immer beide Ausdrücke aus und hat den Wert des rechten Operanden.

```
bool shouldEnd = ((array[i++] = 2), (i >= maxVal));
```
 
Zuerst wird 
	
	
	



```
array[i++] = 2;
```
 ausgeführt, anschliessend i >= maxVal und der gesamte Ausdruck hat den Wert und Typ der Anweisung i >= maxVal.

Daher kannst du damit auch mehrere Ausdrücke in einen "umwandeln". Im Fall oben sieht es so aus:

```
i <= laenge, j >= 0
```

i <= laenge hat keinen Effekt, die Ausführung dieser Anweisung ist in diesem Zusammenhang also komplett sinnlos weil sie nur einen Typ und einen Wert hat ohne aber einen Effekt zu haben. Da ja aber Typ und Wert von der zweiten Anweisung genommen werden kann man sie genau so gut weglassen. Was hier wohl angebrachter wäre:

```
i <= laenge && j >= 0
```


----------



## Padawan (5. April 2011)

Hi,
wollte bei euch, für eure Hilfe bedanken. die waren sehr Hilfreich.

Lg Padawan


----------



## berlusio (7. Januar 2013)

Hey ich hab selbiges Problem, bin es allerdings viel einfach angegangen und darin liegt vielleicht der Fehler?!
Wie man umgekehrt einen String ausgibt, weiß ich ganz einfach zu realisieren. Hier gehe ich ja nur das Feld von vorn nach hinten mit einer for-schleife durch. Ich dachte mir das muss doch auch mit Zwei Strings gehen indem ich den Inhalt der Felder rückwärts in ein anderes schiebe. Leider funktioniert das nicht und ich bekomme immer iwelche verrückten Zeichen auf dem Bildschirm. Kann mir jemand sagen wo der Denkfehler ist?
PS.: Ich muss hinzufügen, dass es mir darum geht, den Sachverhalt möglichst einfach und primitiv zu lösen.
Am Ende soll also statt "Ein" einfach "niE" dastehen.


```
# include <stdio.h>

int main()
{
    int i;
    int j;
    char astring[4] = "Ein";
    char rstring[4] = "";

    for(i=2; i>=0; i--)
    {
        for(j=0; j<4; j++)
        {
            rstring[j]=astring[i];
        }
    }

    printf("%s", rstring);
    return 0;
}
```


----------



## cwriter (7. Januar 2013)

Das Thema ist zwar schon etwas älter, aber naja.

Du zählst von i ab, aber wann immer i um 1 reduziert wird, wird die j-Schlaufe erneut ausgeführt -> Das Programm schreibt viel zu viel. Um es besser sehen zu können:

```
for(i=2; i>=0; i--)
    {
        for(j=0; j<4; j++)
        {
            rstring[j]=astring[i];
        }
        printf("%d:%s\n",i,rstring);
    }
```



ACHTUNG SPOILER!

Hier eine Lösung:


```
#include <stdio.h>
#include <conio.h>
int main()
{
    int i;
    int j = 0;
    char astring[4] = "Ein";
    char rstring[4] = "";

    for(i=2; i>=0; i--)
    {
		rstring[j] = astring[i];
		j++;
	}
 
    printf("%s", rstring);
    _getch();
    return 0;
}
```

Gruss
cwriter


----------



## berlusio (7. Januar 2013)

Vielen Dank. Ja Thema ist alt. Aber hab eben mal die Sufu benutzt!
Nur kenne ich "#include <conio.h>" nicht ebenso "_getch();". Die Funktion funktioniert auch ohne diese Zeilen.


----------



## sheel (7. Januar 2013)

_getch wartet auf einen Tastendruck, damit das Programm nach dem printf nicht einfach zugeht,
sondern das Lesen der Ausgabe möglich ist.

Und conio.h ist die Headerdatei, die _getch beinhaltet.
So, wie printf von stdio.h ist.


----------



## berlusio (7. Januar 2013)

Habe ich bisher noch nicht gesehen. Danke. Jetzt ergibt sich noch eine Frage. Da ja variable Felder nicht möglich sind muss i in der Schleife immer um 1 kleiner sein als das Feld, da sonst ’\0’ mitkopiert wird und dadurch die Ausgabe endet. Gibt es eine Möglichkeit dieses zu ignorieren beim Verschieben. So etwas wie


```
if(astring[i] = = ’\0’)
```

Anweisung


hat da jemand eine Idee?


----------



## cwriter (8. Januar 2013)

Der Vergleich sollte funktionieren. Da erhöhe einfach j um 1, ohne zu kopieren.


----------



## sheel (8. Januar 2013)

Vllt. mal das Blank zwischen = = rausnehmen.


----------

