scanf will nicht (aus: teilstring aus string)



  • Moin Moin!

    Ich hätte da auch noch ne lösung doch die funktioniert nicht so richtig :).
    Ich bin noch anfänger und versuche durch sinnlose(aber lustige) Programme Verzweigungen und Schleifen sinnvoll einzusetzen.

    Also ich versuche den gesamten string aufzuteilen und gleich darauf den teilstring in einen anderen string zu kopieren. Bsp.: Wäre in diesem Fall 3 Wörter wie :"Hallo du da".

    struct stz
       {
         char wort01[101],
              wort02[101],
              wort03[101];
       };
    
    int main()
    {
      struct stz woerter;
      char Satz[5125];
      *p=Satz;
      int Zaehler = 1;
    
      printf("Bitte geben sie einen Satz ein:");
      scanf("%s",&Satz);
    
      while(p)
      {
          if(p==0x20)
          {
              p=0;  
              ++Zaehler;
          }                             
          else
          {
              switch(Zaehler)
              {
                  case 1 : p=woerter.wort01;
                           break;   
                  case 2 : p=woerter.wort02;
                           break;
                  case 3 : p=woerter.wort03;
                           break;  
              }       
          }
          ++p;
    
      }
      printf("Wort01: %s\n",woerter.wort01);
      printf("Wort02: %s\n",woerter.wort02);
      printf("Wort03: %s",woerter.wort03);
    
    }
    

    MFG
    Pascal



  • wo wird p deklariert?

    scanf("%s", Satz);
    

    will es heissen.
    besser noch (wobei ein zeilenumbruch am string haengen bleibt, den man extra abschneiden muss):

    fgets(Satz, sizeof Satz, stdin);
    

    die zuweisungen im switch sind falschrum.
    der code im gesamten while loop hat fuer mich keinen grossen sinn. auch wenn er welchen haben sollte, macht er das nicht.



  • Entschuldigung für den extra Thread. Ich wollte eigentlich in einem bestehenden posten.

    Die While schleife ist für die überprüfung der leerzeichen verantwortlich. Also mache aus jedem leerzeichen ein ende des teilstrings und kopiere jedes Zeichen in einen string/array.

    und der Pointer ist doch mit

    *p=Satz; deklariert oder?



  • > Entschuldigung für den extra Thread. Ich wollte eigentlich in einem bestehenden posten.
    die freiheit hab ich mir genommen, weil dein code eine laengere diskussion benoetigt, die mit "teilstring aus string" nur entfernt was zu tun hat.

    > ...Also mache aus jedem leerzeichen ein ende des teilstrings
    wenn p ein pointer sein soll, dann musst du ihn dereferenzieren, um an den speicher zu kommen, auf den gezeigt wird.
    die zeile muesste dann so lauten:

    *p = 0;
    

    p an sich ist nur die adresse, auf die gezeigt wird. der stern bewirkt, dass man jetzt den speicher an dieser adresse wie eine "normale" variable benutzen kann.

    > und kopiere jedes Zeichen in einen string/array.
    das wird nirgends gemacht. wenn du damit den switch meinst, die zuweisungen sind verkehrtherum und dort werden nur zeiger kopiert, keine strings.
    c strings sind eine gewoehnungsbeduerftige sache, leider. fuer anfaenger sind strings mit das schwerste, weil sie gleichzeitig zeiger verlangen.
    du kannst dir c strings so vorstellen, dass irgendwo im arbeitsspeicher eine reihe von 8-bit-zahlen liegt, die fuer die zeichen des strings stehen. um mit dieser zeichenkette arbeiten zu koennen, muss dieser speicher gleichzeitig einem array gehoeren (char feld[20] = "Hallo") oder man braucht einen zeiger auf das erste zeichen (*char zeiger = "Hallo"; zeigt auf das 'H'). weil man in der regel von einem string nur einen zeiger auf das erste zeichen hat (der name eines arrays laesst sich wie ein zeiger benutzen), muss das ende des strings mit einer null abgeschlossen werden. mit "null" meine ich keine '0', sondern eine ascii-null, also 0, 0x00 oder '\0'.

    *>und der Pointer ist doch mit p=Satz; deklariert oder?
    nein.
    eine deklaration (d.h. die variable erschaffen und typ festlegen) wuerde so aussehen:

    char *p;
    

    die zuweisung wuerde dann so aussehen:

    p = Satz; /* hier werden wieder nur pointer kopiert, nicht die eigentlichen zeichen */
    

Anmelden zum Antworten