char array einlesen, Wörter vertauschen und wieder ausgeben



  • Hallo Forum,

    wir haben die Hausarbeit bekommen, eine Nutzereingabe(maximal 100 Zeichen) als char-array einzulesen, die Wörter dann zu vertauschen und anschließend das array wieder auszugeben. Das Satzzeichen am Ende des Satzes soll dabei jedoch auch nach vertauschen der Wörter am Ende stehen bleiben, z.B.:

    Informatik macht Spass!

    soll zu

    Spass macht Informatik! werden.

    Ich habe ein Programm geschrieben, das soweit auch funktioniert, jedoch habe ich 2 Probleme:

    -bei der Ausgabe sind immer komische Zeichen zwischen dem ersten und letzten Wort wenn das Array doch kleiner als 100 ist, ich vermute dies liegt irgendwie am fgets befehl? anscheinen werden irgendwelche sachen in das array geschrieben, die da nicht hingehören?

    -das mit dem Satzzeichen klappt gar nicht, obwohl ich es extra einfach als eigenständige Anweisungen geschrieben habe, was könnte da mein Fehler sein?

    #include <stdio.h>
    #include <conio.h>
    
    int main()
    {
      //Deklarationen
      int const max=100;
      int wortanfang=0,i,u,wortende=0;
      char textbereich[max], textbereichneu[max], satzzeichen;
    
      //Deklarationen ENDE
    
      //Eingabe des Textes in das textbereich array
      printf("Bitte geben Sie einen Text von maximal 100 Zeichen ein:\n");
      fgets(textbereich,max,stdin);
      //Eingabe des Textes in das textbereich array ENDE
    
      if(textbereich[sizeof(textbereich)-1]=='.'||textbereich[sizeof(textbereich)-1]==','||textbereich[sizeof(textbereich)-1]=='!'||textbereich[sizeof(textbereich)-1]=='?')
    	  satzzeichen=textbereich[sizeof(textbereich)-1];   //textbereich[sizeof(textbreich)-1] entspricht Wert des letzten Elements des Arrays  
                                        //(sizeof geht nur bei char in der From, da es anzahl elemente * groesse de einzelenen elemente rechnet, diese ist bei char aber 1)
    
      for(i=0;i<sizeof(textbereich);i++)
      {
    	  if(textbereich[i]==' '||i==sizeof(textbereich)-1)     //sizeof(textbreich)-1 entspricht letzten durchlauf der for-schleife
    	  {
    		  wortende=i;
    	  }
    
    	  if(wortende!=0)
    	  {
    		  for(u=0;u<=wortende-wortanfang;u++)
    		  {
    			  textbereichneu[sizeof(textbereich)-1-wortende+u]=textbereich[wortanfang+u];
    		  }
    		  wortanfang=wortende+1;
    	      wortende=0;
    	  }
    
      }
    
      //Ausgabe neuer Text
      for(i=0;i<sizeof(textbereichneu);i++)
      {
    	  printf("%c",textbereichneu[i]);
      }
      printf("%c",satzzeichen);
      //Ausgabe neuer Text ENDE
    
      getch();
      return 0;
    }
    

    Ich hänge noch ein Bild an, damit ihr seht, was ich meine:

    http://www.bilder-upload.eu/show.php?file=5a7700-1430404655.jpg



  • sizeof ist in diesem Fall falsch. Das Ergebnis is die Anzahl Bytes des Arrays, die sich nicht ändert.

    Der richtige Befehl lautet strlen():

    http://www.cplusplus.com/reference/cstring/strlen/?kw=strlen

    Mit strchr kannst du einzelne Zeichen suchen:

    http://www.cplusplus.com/reference/cstring/strchr/?kw=strchr

    Am Besten wäre es, wenn du std::string verwenden würdest.



  • Schau dir auch mal die Funktionen aus <cctype> an: http://www.cplusplus.com/reference/cctype/

    Und fgets speichert das '\n' von der Entertaste mit ab.
    Daher ist das dann auch dein letzes Zeichen.



  • Hallo, danke euch beiden, nun habe ich es soweit hinbekommen, dass auch das mit dem Satzzeichen passt. Das Problem, dass die Ausgabe immernoch mit komischen Zeichen voll ist, wenn ich weniger als 100 Zeichen eingebe habe ich jedoch immernoch, verstehe auch noch nicht so ganz wieso 😕

    http://www.bilder-upload.eu/show.php?file=682b1d-1430417774.jpg

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    
    int main()
    {
      //Deklarationen
      int const max=100;
      int wortanfang=0,i,u,wortende=0;
      char textbereich[max], textbereichneu[max], satzzeichen;
    
      //Deklarationen ENDE
    
      //Eingabe des Textes in das textbereich array
      printf("Bitte geben Sie einen Text von maximal 100 Zeichen ein:\n");
      fgets(textbereich,max,stdin);  
      printf("\n");
      //Eingabe des Textes in das textbereich array ENDE
    
      if(textbereich[strlen(textbereich)-2]=='.'||textbereich[strlen(textbereich)-2]==','||textbereich[strlen(textbereich)-2]=='!'||textbereich[strlen(textbereich-2)]=='?')
      {  satzzeichen=textbereich[strlen(textbereich)-2];   //textbereich[strlen(textbreich)-1] entspricht Wert des letzten Elements des Arrays auch wenn es kürzer als 100 ist
          textbereich[strlen(textbereich)-2]=' '; //löscht das satzzeichen vom letzten wort, damit es dann nicht 2mal auftaucht  //(sizeof geht nur bei char in der From, da es anzahl elemente * groesse de einzelenen elemente rechnet, diese ist bei char aber 1)
      }								//-2 wegen enter als letztes array element bei fgets und array zählt von 0 daher -2
    
      for(i=0;i<sizeof(textbereich);i++)
      {
    	  if(textbereich[i]==' '||i==sizeof(textbereich)-1)     //sizeof(textbreich)-1 entspricht letzten durchlauf der for-schleife
    	  {
    		  wortende=i;
    	  }
    
    	  if(wortende!=0)
    	  {
    		  for(u=0;u<=wortende-wortanfang;u++)
    		  {
    			  textbereichneu[sizeof(textbereich)-1-wortende+u]=textbereich[wortanfang+u];
    		  }
    		  wortanfang=wortende+1;
    	      wortende=0;
    	  }
    
      }
    
      //Ausgabe neuer Text
      for(i=0;i<sizeof(textbereich)-1;i++)
      {
    	  printf("%c",textbereichneu[i]);
      }
      printf("%c",satzzeichen);
      //Ausgabe neuer Text ENDE
    
      getch();
      return 0;
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • - VLA benutzen nur Deppen
    - du sollst überall statt sizeof strlen benutzen



  • Ok, ich bedanke mich bei jeden von euch, jetzt funktioniert alles!

    Soweit ich das verstehe, ist die größe in meinen Fall ja z.b. 100 und nur durch fgets kann es eventuell kleiner ausfallen.

    Das Problem wäre dann nur die Speicherverschwendung, weil ja 100 plätze reserviert sind, auch wenn eigentlich weniger gebraucht werden, richtig?

    Bei uns wird derzeit kein Wert auf Performance gelegt aber es ist gut, das zu wissen und für die Zukunft zu bedenken. 👍



  • Diese Speicherverschwendung zu vermeiden ist in C nur schwer möglich.
    Aber 100 Byte spielen heutzutage keine Rolle mehr.


Anmelden zum Antworten