?
Das seh ich genau andersrum. strtok ist ziemlich simpel, mit sscanf muss man höllisch aufpassen, sich keine Buffer-Overflows einzuhandeln. Das einzige, was man bei strtok halt wissen muss, ist, dass man keine eigenständigen Strings zurückkriegt sondern Zeiger in den beim ersten Aufruf übergebenen Buffer - damit man nicht auf die Idee kommt, über den Rückgabewert von strtok Zeiger in einen lokalen Buffer aus einer Funktion zurückzugeben oder so.
Da im konkreten Fall aber sowieso eine Längenbeschränkung vorliegt, ist die Verwendung von sscanf wohl vertretbar, sofern man die Länge der Eingabeargumente entsprechend beschränkt. Beispiel:
#include <stdio.h>
struct adresse {
char name[15];
char vorname[15];
char strasse[30];
char plz[10];
char ort[20];
};
int main(void) {
char zeile[] = { "Mustermann;Max;Musterstraße 12;12345;Musterhausen" };
struct adresse adr;
if(5 == sscanf(zeile,
"%14[^;];%14[^;];%29[^;];%9[^;];%19[^;]", /* <-- Längenbeschränkungen! */
adr.name,
adr.vorname,
adr.strasse,
adr.plz,
adr.ort)) {
printf("%s %s\n%s\n%s %s\n", adr.vorname, adr.name, adr.strasse, adr.plz, adr.ort);
}
return 0;
}
Ein Nachteil dabei ist natürlich, dass jedes mal, wenn du die Bufferlängen im Struct änderst, auch der einlesende Code verändert werden muss. Man kann sich da prinzipiell mit Makrokonstruktionen behelfen, aber besonders hübsch ist das dann auch nicht.