Einzelne Wörter umdrehen
-
naja er kommt net durch die erste schleife in der schleife
er durchläuft sie solange bis er die grenze von int i erreicht hat
-
Hast du schon mal darüber nachgedacht, für deinen Anwendungsfall Funktionen zu verwenden? Wenn nein, dann wird es Zeit.
-
Die Bedingung bei
while(text1[i]!=' ' || text1[i]!='\0')
ist immer WAHR.
Denn wenn text1[i] ein Lerrzeichen ist, dann ist es aber ungleich '\0' und somit ist die Bedingung durch das ODER immer WAHR.
-
#include <stdio.h> #include <stdlib.h> int calculateLength(char* text) //die Schleife läuft solange, bis "\0" erreicht wird, und erhöht bei jedem Durchlauf unseren Integer "i" { int i; for(i=0; text[i] != '\0'; i++); return i; } char* inverse(char* reverse_text) //Funktion wird im main() aufegrufen und übernimmt als Parameter den eingetippten String { int i; int strlength; char* invertiert = NULL; strlength = calculateLength(reverse_text); //Aufruf der Funktion calculateLength mit dem Parameter "reverse_text(=unser eingelesener String), Berechnung der Stringlänge invertiert = (char*)malloc((strlength) * sizeof(char)); //wir fordern Speicher an if(invertiert != NULL) //hat die Speicheranforderung geklappt, wird die for-Schleife ausgeführt { for(i=0; i < strlength; i++) { invertiert[i] = reverse_text[strlength - i - 1]; //hier wird im character-Array von hinten nach vorne gezählt und der jeweilige Inhalt kopiert } return invertiert; } else return NULL; //Speicheranforderung hat versagt, so wird NULL retouniert } int main() { char i; char str1[i]; //Programm Execution beginnt hier, Einlesen des Strings printf("\nBitte den zu invertierenden String eintippen: "); gets(str1); printf("\nDer invertierte String lautet: %s\n", inverse(str1)); //Platzhalter "%s" hat den Inhalt: Das Resultat der Funktion "inverse", wenn wir ihr als Parameter den zu invertierenden String übergeben return 0; }
-
iiiiihhhh
-
Da sind ja schlimmere Fehler drin als beim TO.
-
http://ideone.com/6dMUM
*gähn
-
Das ist etwas umständlich, Pi. Es gibt da im Standard zwei Zauberfunktionen, die hierfür sehr praktisch sind:
#include <stdio.h> #include <string.h> void swap(char *p, char *q) { char c = *p; *p = *q; *q = c; } void reverse(char *first, char *last) { if(last <= first) return; swap (first , last - 1); reverse(first + 1, last - 1); } char *skip(char *data, char const *trenner) { return data + strspn(data, trenner); /* <-- hier */ } int main(void) { char buffer[1024]; char *p, *q; /* Bei Bedarf hier weitere Satzzeichen einfügen */ char const *const trenner = " \t\n,.!?;"; fgets(buffer, sizeof(buffer), stdin); for(p = skip(buffer, trenner); *p; p = skip(q, trenner)) { q = strpbrk(p, trenner); /* <-- und hier */ reverse(p, q); } printf("%s", buffer); return 0; }
Beispiellauf:
Das Haus ist so groß, dass man sich nicht mehr darin zurechtfindet; unser Hund ist verschollen! saD suaH tsi os ßorg, ssad nam hcis thcin rhem nirad tednifthceruz; resnu dnuH tsi nellohcsrev!
-
Nachtrag: Kleiner Denk- und Testfehler meinerseits; bei überlangen Eingaben kann das in der angegebenen Form Probleme machen (wenn fgets am Ende kein '\n' anhängt und das letzte Zeichen des Strings nicht in trenner ist). Zeile 31 sollte besser
q = p + strcspn(p, trenner);
lauten, dann klappt's auch da.
-
danke erstmal für die zahlreichen Hilfen.
-
Also die Varianten mit den Funktionen klappen super also erstmal danke
Nur leider darf ich keine Funktionen nehmen, da wir die eig. noch nicht hatten.
Aus diesem Grund hab ich meinem Code ein Paar Kontrollausgaben beigelegt.int main() { char text1[80]; char text2[80]; int i,j,k,l; k,l,i,j = 0; fgets(text1,80,stdin); do { do { k = i; i++; printf("a"); }while(text1[k]!='\x20' && text1[k]!='\0'); for(j=k-1 ; j>=l ; j--) { text2[(k-1)-j]=text1[j]; printf("b"); } printf("c"); l = i; j = 0; if (text1[k]=='\x20') { text2[k]=' ';} }while(text1[k]!='\0'); text2[k]='\0'; printf("%s",text2); getch(); return 0; }
Wenn ich jetzt einen 3-Stelligen String eingebe wie z.B.: "asd"
So gibt er mir aus: aaaac
Sprich er überspringt die For-SchleifeVielleicht bin ich blind aber ich versteh einfach nicht warum das passiert ich meine die Bedingung ist ja wahr
-
@seldon: Danke, diese Funktionen kannte ich nicht. Dein rekursives revese finde ich sehr elegant.
@luggas: Wenn du weißt, wie man Funktionen benutzt, kannst du sie ja auch verwenden. Dein Lehrer wird sich bestimmt auch freuen, wenn du mehr weißt als die anderen.
-
314159265358979 schrieb:
@seldon: Danke, diese Funktionen kannte ich nicht. Dein rekursives revese finde ich sehr elegant.
Du leidest an Geschmacksverirrung.
-
@PI ja klar freut ihn das nur es muss ja auch ohne funktionen gehen^^
-
Schreib doch mehr in deine Kontrollausgabe:
[url]printf("a> i: %d, j: %d, k: %d, l: %d | Zeichen: %c (%d)\n", i, j, k, l, text1[k], text1[k]);[/url]
dann siehst du wo der Fehler steckt.
-
volkard schrieb:
Du leidest an Geschmacksverirrung.
Das hätte wohl besser in meinen Spamthread im Mathe-Physik-Bereich gepasst. Dort hätte ich es noch irgendwie nachvollziehen können. Hier leider nicht.
luggas schrieb:
@PI ja klar freut ihn das nur es muss ja auch ohne funktionen gehen^^
Mach dir doch das Leben nicht unnötig schwer.
-
das is ne gute idee mal schaun was raus kommt
-
Das sollten c++ Tags sein
Beachte auch die Warnungen vom Compiler.
-
Naja, die Tail-Rekursion dürfte ein Compiler schon rausoptimieren können. Aber wenn es eher volkards Geschmack entspricht:
void reverse(char *first, char *last) { if(last <= first) return; for(--last; first < last; ++first, --last) { swap(first, last); } }
Es läuft am Ende auf das selbe hinaus.
-
Das mit den zusätzlichen Kontrollausgaben war ne geile Idee danke so komm ans Ziel