String & zeichenketten / Programm Vornamen



  • flush_stdin kennt also dein vs ?



  • Die zeile 9 müsst ihr noch löschen...

    Also ich dachte immer das wir in der Schule C programmieren, nichts anderes... Unser Lehrer bringt es uns so bei und sagt von sich aus das er C - Programmiersprache unterrichte... 😮

    Wie wäre denn dann die saubere C Programmierlösung?
    Wie kann man denn mehrere zeichenketten in einem array speichern und diese mit zahlen aufrufen?

    ich hab gehört das von scanf noch irgendwas im Speicher ist und gets deshalb den rest im speicher einfach für die erste eingabe nimmt.... oder so ähnlich.

    Thx für die Antworten, hoffe ich bekommen hier noch Licht ins Dunkle. 🙂

    MfG
    Gustl



  • Gustl schrieb:

    ich hab gehört das von scanf noch irgendwas im Speicher ist und gets deshalb den rest im speicher einfach für die erste eingabe nimmt.... oder so ähnlich.

    Das ist leider richtig, das "Return" wird nicht in die Variable gespeichert, sondern noch im Speicher belassen, kannst du mit

    getchar();

    aber "rausfischen".



  • wenn ich fflush(stdin); schreibe gehts.
    lasse ich es weg, wird auch bei mir die eingabe des zweiten namen übersprungen

    das ist also das alte lied vom pufferleeren.

    dafür nehme man bekanntlich anstatt fflush(stdin) lieber

    void Reset()
    {
    setvbuf( stdin, NULL, _IONBF, 0 );
    setvbuf( stdin, NULL, _IOFBF, BUFSIZ );
    }



  • @Gustl

    Welche Dateiendung hat dein main Programm, *.c oder *.cpp ?
    Bei einer *.cpp Datei schaltet der Compiler automatisch in den C++ Modus.



  • So klappt's! Schön C-mäßig mit malloc.

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    int main(void) 
    { 
      int i, anzname, a=0, posi; 
      char vergleich[100];
      char **namen;
      printf(" Wieviele Vornamen sollen eingegeben werden? "); 
      scanf(" %i",&anzname); 
    
      namen=malloc(anzname*sizeof(char*));
      namen[0]=malloc(anzname*100);
      for(i=0;i<anzname;i++) {
        namen[i]=namen[0]+i*100;
      }
      //flush_stdin();  //kennt mein VS natürlich nicht... 
      fflush(stdin);    //dafür gibt's ja das hier!
      printf("\n"); 
      for(i=0;i<anzname;i++) 
      { 
        printf(" %i. Vornamen eingeben: ",i+1); 
        gets(namen[i]);  //<------- 
        //scanf (" %s", &namen[i]);                     
      } 
      printf("\n Namen eingeben der gesucht werden soll:"); 
      gets(vergleich); //<------ 
      //scanf(" %s",&vergleich); 
      for(i=0;i<anzname;i++) 
      { 
        if(strcmp(namen[i],vergleich) == 0) 
        { 
          if(a==0){
            posi=i+1;
          }
          a++;
        }
      } 
      if(a != 0){ 
        printf("\n\n Der Vorname %s tritt als erstes auf Position %i auf und insgesamt %ix\n\n\n", vergleich, posi, a);} 
      if(a == 0){ printf("\n\n Der Vorname konnte nicht gefunden werden\n\n\n");} 
      system(" PAUSE");    
      return 0; 
    }
    

    Ja, kein fflush(stdin), ich weiß. Mit dem VS klappt's aber...

    Und für den Gustl was zu lesen: http://c-faq.com/aryptr/dynmuldimary.html



  • Klasse, danke euch. 🙂
    Hier wird man ja gut beraten!

    kann mir noch einer erklären was es genau mit malloc aufsich hat, dann bin ich voll und ganz zufrieden. 🙂

    Gruß

    Edit: Die Endung ist *.c



  • Big Brother schrieb:

    @Gustl

    Welche Dateiendung hat dein main Programm, *.c oder *.cpp ?
    Bei einer *.cpp Datei schaltet der Compiler automatisch in den C++ Modus.

    Soweit ich weiß, werden auch die .c-Dateien mit dem C++-Compiler kompiliert. Deshalb sollte man in den Eigenschaften der .c-Datei (C/C++ => Erweitert => Kompilierungsart) immer explizit angeben, dass der C-Compiler genutzt werden soll.

    Ein Kollege hatte mal eine Mail rundgeschickt, in der er uns gebeten hat, die Eigenschaften für alle C-Dateien so einzustellen, da sonst das C-Errorhandling (__try) irgendwie Probleme macht...



  • Gustl schrieb:

    Klasse, danke euch. 🙂
    Hier wird man ja gut beraten!

    kann mir noch einer erklären was es genau mit malloc aufsich hat, dann bin ich voll und ganz zufrieden. 🙂

    Gruß

    Mit malloc/calloc/realloc (google mal nach diesen Stichwörtern) kannst du für eine Variable dynamisch Speicher allozieren. Das willst du ja auch. Du erzeugst eine Variable (bzw. Array), liest dann die Benutzereingabe ein ("wieviele Namen?") und möchtest dann, dass die Variable entsprechend viel Platz bekommt.



  • googlen wäre wohl nicht schlecht, stimmt...

    http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/malloc.html

    danke

    Werde bestimmt hin und wieder mal auf dieses Forum zurück greifen und dann hoffe ich dass ich auch so gut beraten werde. 🙂

    Hab in einem anderen Forum dies gepostet und da wurde mir nur gesagt das ich in die codebox schaun soll... 😞 und da versteh ich nur bahnhof. 😞


Anmelden zum Antworten