Zeiger auf Felder



  • Abend,

    also wie Bashar schon gesagt hatte, solltet ihr gets unbedingt weglassen, weil -> "Da es unmöglich ist zu sagen, wie viele Zeichen Zeichen gets() lesen wird, ohne die Daten vorher zu kennen und da gets() fortfährt und Daten über das Ende des Puffers hinaus speichert, ist es sehr gefährlich, diese Funk­tion zu benutzen. Sie wurde benutzt um in Rechner einzubrechen. Benutze fgets() anstatt." (aus der man page von gets) 😉

    Wenn ich den Code von quizzmaster ein wenig umbaue, und ein wenig von meinem kleinen C-Wissen einfließen lasse, dann funktionierts.

    Hier mein Quellcode:

    #include <stdio.h>
    
    int main()
    {
       char  name[20];
       char  vname[20];
       char  nname[20];
       char* ptr;
       char* ptr1;
       char* ptr2;
       int   i,a;
    
       printf( "Geben Sie ihren Vornamen und Nachnamen ein: " );
        scanf( "%[^\n]s", name );
    
       for( i = 0; i < 20; i++ )
       {
          ptr = &name[ i];
    
          if( *ptr == ' ' )
             break;
       }
    
       i    = 0;
       ptr1 = &name[0];
    
       for( ptr1 = name; ptr1 <= ptr; ptr1++, i++ )
          vname[ i] = *ptr1;
    
       a    = 0;
       ptr  = &name[19];
       ptr2 = &name[ i];
    
       for( ptr2 = ptr1; ptr2 <= ptr; ptr2++ )
       {
          nname[a] = *ptr2;
          i++;
          a++;
       }
    
       printf( "\nVorname ....: %s ", vname );
       printf( "\nNachname ...: %s \n\n", nname );
    
       getchar();
    
       return 0;
    }
    

    Dann wäre da noch was: main sollte immer einen Rückgabewert haben -> daher int main und return. Schau dazu mal in die FAQ, da hatte irgendwer mal nen schönen Beitrag zu geschrieben - glaube es war Shade 😉

    [ Dieser Beitrag wurde am 23.03.2003 um 20:06 Uhr von guard editiert. ]



  • OK ich hatte das mit gets(); nicht mehr verändert, dass liegt aber daran, dass ich noch 😡 Latein Vokabeln 😡 lernen musste üarg konnte aber alle 😃 , weil ich vorher tagelang üben musste 🙄



  • schreibt den Code doch nicht ab. Das kann man eleganter vor vorn in 10-15 Zeilen schreiben.



  • Danke für eure Antworten.
    Habe das Prog von Guard gestartet. Wenn ich nun zB. Karl Meier eingebe, bringt das Prog:
    Vorname....: Karl |||||||||||| Karl Meier
    Nachnahme..: Meier
    richtig sollte es aber so sein:
    Vorname....: Karl
    Nachnahme..: Meier
    vielleicht findet einer von euch noch den fehler. Nochmals besten Dank für die bisherige Hilfe und viele Grüße
    Jens



  • ich würde das so machen

    #include <string.h>
    #include <stdio.h>
    
    int main(void)
    {
      fputs("Namen und Vornamen eingeben: ",stdout);
      char buffer[100];
      fgets(buffer,100,stdin);
      size_t i=0;
      for(;buffer[i]&&buffer[i]!=' ';++i);
      char nachname[i];
      memcpy(nachname,buffer,i);
      nachname[i]=0;
      size_t n=strlen(buffer+i+1);
      char vorname[n];
      memcpy(vorname,buffer+i+1,n);
      vorname[n-1]=0;
      printf("nachname: %s vorname: %s\n",nachname,vorname);
      return 0;
    }
    

    oder mit der Hilfe von strtok

    #include <string.h>
    #include <stdio.h>
    
    int main(void)
    {
      fputs("nachname vorname eingeben: ",stdout);
      char buffer[100];
      fgets(buffer,100,stdin);
      char nachname[100];
      strcpy(nachname,strtok(buffer," "));
      char vorname[100];
      strcpy(vorname,strtok(NULL," "));
      printf("nachname: %s vorname: %s",nachname,vorname);
      return 0;
    }
    


  • Hallo,

    ich hab da auch mal was gebastelt:

    #include <stdio.h>
    
    int main()
    {
      char name[40];
      char vname[20];
      char nname[20];
      char *n = name;
      char *vn = vname;
      char *nn = nname;
    
      fgets(name,38,stdin);
    
      while(*n != ' ')
             *(vn++) = *(n++);
    
         n++;
         *vn='\0';
    
      while (*n)
         *(nn++)=*(n++);
    
         *nn = '\0';
    
       printf( "\nVorname ....: %s ", vname );
       printf( "\nNachname ...: %s \n\n", nname );
    
      return 0;
    }
    

    @ kingruedi
    was macht eigentlich die Zeile "char nachname[i];"? Irre ich mich, oder geht das doch gar nicht.

    grüße Con@n

    [ Dieser Beitrag wurde am 23.03.2003 um 23:13 Uhr von Con@n editiert. ]



  • Original erstellt von guard:
    also wie Bashar schon gesagt hatte, solltet ihr gets unbedingt weglassen, weil -> "[i]Da es unmöglich ist zu sagen, wie viele Zeichen Zeichen gets() lesen wird, ohne die Daten vorher zu kennen und da gets() fortfährt und Daten über das Ende des Puffers hinaus speichert, ist es sehr gefährlich, diese Funktion zu benutzen.

    und was machst du? verwendest scanf wie gets mit allen nachteilen und keinen vorteilen (nur n kleiner overhead zusätzlich)



  • Original erstellt von Shade Of Mine:
    und was machst du? verwendest scanf wie gets mit allen nachteilen und keinen vorteilen (nur n kleiner overhead zusätzlich)

    Mal ganz smooth bitte ... erstens war das nur ne Demonstration wie man es hätte machen können (btw: lief das Programm bei mir genau wie es sollte); 2. hätte ich das ganze Programm anders aufgebaut und 3. ... das Argument überleg ich mir noch ...



  • was macht eigentlich die Zeile "char nachname[i];"? Irre ich mich, oder geht das doch gar nicht.

    wilkommen in der Zeit des C99 Standards:

    seit dem C99 Standard ist das erlaubt und der GCC kompiliert das auch mit -std=c99 hervorragend



  • Original erstellt von Con@n:
    was macht eigentlich die Zeile "char nachname[i];"? Irre ich mich, oder geht das doch gar nicht.

    Doch es geht schon; es deklariert ein Feld vom Typ char mit i Einwohnern und zerstört es am Blockende wieder.

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
        char buf[100];
        char *p;
    
        if (!fgets(buf, sizeof buf, stdin)) return 1;
    
        if (p = strchr(buf, ' ')) {
            *p = '\0';
            /* wenn kein Schreibzugriff erwünscht, dann die Differenz bestimmen und mit fwrite ausgeben; _nicht_ wild rumkopieren! */
            ++p;
            printf("Vorname %s, Nachname %s\n", buf, p);
        } else /* Kein Name */;
    
        return 0;
    }
    

    Oder ohne Felder:

    #include <stdio.h>
    
    int main(void)
    {
        int c;
    
        fputs("Vorname ", stdout);
        while ((c = getchar()) != EOF) {
            if (c == ' ') fputs(" Nachname", stdout);
            putchar(c);
        }
    
        return 0;
    }
    

    /me hat gerade nichts zu tun :).


Anmelden zum Antworten