String verdoppeln
-
#include <stdio.h> #include <string.h> int main() { char eingabe[100]; char ausgabe[200]; // Da wir jeden Buchstaben verdoppeln wird die Ausgabe im Extremfall doppelt so groß sein wie die Eingabe int i, j, len; scanf("%99[^\n]", eingabe); len = strlen(eingabe) + 1; // Wir nehmen das Terminierungszeichen mit, dann brauchen wir selber keine Terminierung vornehmen for (i = 0, j = 0; i < len; ++i, j += 2) { ausgabe[j] = eingabe[i]; ausgabe[j + 1] = eingabe[i]; } printf("%s", ausgabe); return 0; }
-
SeppJ schrieb:
und warum da beispielsweise
(*e != 0) && (e = e + 1)
und nicht etwa(*e != 0) || (e = e + 1)
, obwohl das Ergebnis des Ausdrucks doch in beiden Fällen das gleiche wäre. (Zusatzfrage: Warum wäre es das gleiche Ergebnis?)Das würde mich jetzt auch mal interessieren. Für mich sieht es auf den ersten Blick so aus, als wenn der zweite Ausdruck auch noch zu TRUE ausgewertet wird, wenn der Eingabestring bereits abgearbeitet ist, während der erste Ausdruck richtigerweise FALSE ergibt, wenn das terminierende '\0'-Zeichen kopiert ist ...
-
Ja, es würde mit ODER nicht abbrechen, war doof formuliert. Aber solange es läuft ergeben beide Ausdrücke immer TRUE, egal ob mit && oder ||. Jedoch wird e nicht erhöht, wenn man || benutzt.
-
Alles klar ...
-
Ah ok dann hab ich jetzt auch verstanden.
Wenn die erste Bedingung nicht mehr funzt wird die 2. auch nicht mehr weiter gemacht. Wobei ich sagen muss dass das ein bischen over the top ist.
Ich meine ich kann den Zähler auch in der While Schleife laufen lassen. Hat genau den gleichen effekt und ich würd behaupten es ist auch Fehler unanfälliger...
Und beim Tippen brauche ich weniger Zeichen. Und mehr Rechenenaufwand ist es für den PC auch nicht.
Sieht sehr schön aus und wirkt auch sehr Kompakt...aber im Grunde etwas too much...
Ich lass mich ja gern berichtigen wenn diese Schreibweiße:while (*e != 0) { *a = *e; a = a + 1; *a = *e; a = a + 1; e=e+1 }
Schlechter ist als die:
do { *a = *e; // In Ausgabe das Zeichen der Eingabe setzen a = a + 1; // Ausgabezeiger eines weiter setzen *a = *e; // In Ausgabe das Zeichen der Eingabe setzen a = a + 1; // Ausgabezeiger eines weiter setzen } while ((*e != 0) && (e = e + 1)); // Solange das Eingabezeichen nicht 0 ist. Außerdem Eingabezeiger um eines weiter setzen.
-
for(e=eingabe;*e!='\0';++e)//Diesen Schleifenkopf erkennt man als //fertiges Idiom: Laufe über den ganzen String. { *a++ = *e;//*a++= erkennt man auch al fertiges Idiom: Schreibe in //einen String wie in einen Stream rein. *a++ = *e; } *a='\0';//Ausgabestring terminieren
-
Odatas schrieb:
Ich lass mich ja gern berichtigen wenn diese Schreibweiße:
while (*e != 0) { *a = *e; a = a + 1; *a = *e; a = a + 1; e=e+1 }
Schlechter ist als die:
do { *a = *e; // In Ausgabe das Zeichen der Eingabe setzen a = a + 1; // Ausgabezeiger eines weiter setzen *a = *e; // In Ausgabe das Zeichen der Eingabe setzen a = a + 1; // Ausgabezeiger eines weiter setzen } while ((*e != 0) && (e = e + 1)); // Solange das Eingabezeichen nicht 0 ist. Außerdem Eingabezeiger um eines weiter setzen.
Natürlich ist die zweite Schreibweise schlecht. Schließlich ist das die extra umständliche Schreibweise, die ich aus meinem ursprünglichen, kurzen, knackigen
do { *a++ = *e; *a++ = *e; } while (*e++ != 0);
gemacht habe, damit du es verstehst.