Einzelne Wörter umdrehen



  • Für die Schule soll ich ein Programm schreiben, welches auf eine Eingabe des Benutzers wartet. Die Eingabe soll ein String mit Leerzeichen sein.
    Dann soll das Programm jedes einzelne Wort drehen.

    Zum Beispiel:

    Eingabe: Das Haus ist groß!
    Ausgabe: saD suaH tsi !ßorg

    Natürlich habe ich es schon allein versucht nur leider scheint sich mein Programm in einer Schleife zu verfangen.

    Code:

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
    	char text1[80];
    	char text2[80];
    	int i,j,k,l;
    	k,l = 0;
    	fgets(text1,80,stdin);
    	do
    	{
    		i = k;
    		while(text1[i]!=' ' || text1[i]!='\0')
    		{
    			k = i;
    			i++;
    		}
    
    		for(j=i-1 ; j>=l ; j--)
    		{
    			text2[(i-1)-j]=text1[j];
    		}
    		l = k;
    	}while(text1[i]!='\0');
    	printf("%s",text2);
    	getch();
    	return 0;
    }
    

    Vielleicht habt ihr ne Idee was ich falsch gemacht habe.
    Ich bitte um eure Hilfe. 🙂



  • Nimm den Debugger oder mach ein paar Kontrollausgaben in deiner Schleife.

    Was passiert bei Leerzeichen (auch Leerzeichen am Anfang vom Text).



  • 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.





  • 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-Schleife 😕

    Vielleicht 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.


Anmelden zum Antworten