Hilfe zu sscanf()

ibafluss

Erfahrenes Mitglied
Hey Leute!
Ich hab ein Programm in einem Buch gesehen, nur gibt es da etwas was ich nicht verstehe:

Code:
#include <stdio.h>
#include <stdlib.h>
#define NUMITEMS 4

char *namen[4] = {
   "Jürgen", "Fatma", "Gismo", "Jonathan"
};

int main(void) {
   int schleife;
   char temp[4][80];
   char name[20];
   int alter;
   long lohn;

   /* Wir erstellen Namen, Alter und Gehalt. Alter und Gehalt
    * werden durch Zufallszahlen erzeugt. Mit sprintf schreiben
    * wir die Daten formatiert nach int temp. */
   for (schleife = 0; schleife < NUMITEMS; ++schleife)
      sprintf(temp[schleife], "%s %d %ld"
         ,namen[schleife], rand()%20+18, rand()+27500L);

   /* Wir erstellen eine Kopfzeile. */
   printf("%4s | %-20s | %5s | %9s\n",
       "#","Name","Alter","Gehalt");
   printf(" ----------------------------------------"
          "----------\n");

   /* Mit sscanf lesen wir die Daten formatiert aus temp aus,
    * und zwar dort, wo wir zuvor mit sprintf die Daten
    * formatiert geschrieben haben. */
   for (schleife=0; schleife < NUMITEMS; ++schleife) {
      sscanf(temp[schleife],"%s %d %ld",(char*)&name,&alter,&lohn);    
      printf("%4d | %-20s | %5d | %9ld\n",
         schleife+1,name,alter,lohn);
   }
   return EXIT_SUCCESS;
}

Meine Frage: warum ist in der 33.Zeile bei name ein & und die explizite Dateiumwandlung (char *) erforderlich? Wenn ich einfach nur name angebe geht es nicht und meine Frage ist warum? Ich gebe ja den Namen eines Arrays, also einen Zeiger auf das erste Element. Warum funktioniert das nicht?

Lg und danke schon im Voraus! :)
 
Hi

normalerweise sollte es ohne (char*)& gehen. Komisch, komisch...

PS: Das ist keine Dateiumwandlung, sondern eine Typumwandlung (auch Cast genannt)
 
Wenn ich nur name angebe, stürzt das Programm ab, wie wenn man beim scanf das & vor Variablen vergisst.

Ach ja genau ;)
 
Ich kann mir das nur so erklären: Dein Compiler stellt fest, das name vom Type char[] ist, das %s aber ein char* erwartet, was rein technisch identisch ist. Aber der Adress-Operator ist IMHO hier unnötig. Genügt es nicht, "nur" zu casten?

C:
sscanf(temp[schleife],"%s %d %ld",(char*)name,&alter,&lohn);

Funktioniert bei mir tadellos in MinGW gcc 4.5. Welchen Compiler verwendest du?
 
Hallo,

hab's gerade mal schnell ausprobiert: Also bei geht's ohne "(char*)&" und kein Absturz (gcc, Linux). Bist du dir sicher, dass der Absturz an der Stelle passiert? Lass dir doch mal vor dem sscanf den Inhalt von "temp[schleife]" anzeigen.

Gruß
MCoder
 
Zurück