Da hätte ich jetzt noch glatt etwas vergessen.
Angenommen ich habe ein String mit dem Format: NAME,ORT,ALTERWarum funktioniert dann folgendes nicht:
char *string = "NAME,ORT,ALTER";
char *name; // soll enthalten NAME
char *ort; // soll enthalten ORT
char *alter; // soll enthalten ALTER
Die Zeiger "name", "ort" und "alter" sind nicht initialisiert!
Ein einfaches Beispiel:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int iRetCode = 0;
const char* pszString = "NAME,ORT,ALTER";
char* pszName = (char*) calloc(strlen(pszString) /* + 1 fuer die terminierende \0 */ + 1, sizeof(char));
char* pszOrt = (char*) calloc(strlen(pszString) + 1, sizeof(char));
char* pszAlter = (char*) calloc(strlen(pszString) + 1, sizeof(char));
if ((NULL == pszName) || (NULL == pszOrt) || (NULL == pszName)) {
/*
* iRetVal setzen,
* weitere Fehlerbehandlung
*/
} else {
if ((int)strlen(pszString) >
/*
* sscanf liest bei %s bis zu Whitespaces; z:B. " ";
* bei anderen Separatoren brauchst Du %[]
*/
sscanf(pszString, "%[^,],%[^,],%[^,]", pszName, pszOrt, pszAlter)) {
/*
* String wurde nicht vollstaendig konsumiert;
* iRetVal setzen,
* weitere Fehlerbehandlung
*/
} else {
/*
Strings verarbeiten
*/
};
}
free(pszName); /* free(NULL) ist immer ok! */
free(pszOrt);
free(pszAlter);
return iRetCode;
}
Hier ist nun so, dass die variable name dann gleich NAME,ORT,ALTER enthält. Wie ist das möglich?
sscanf hat in Deiner Version den gesamten String schon mit dem ERSTEN Format-Spezifizierer konsumiert da er kein "Whitespace" fand. Siehe Code.
---
Es gibt in diesem Thread einige Stellungnahmen zu sscanf etc; aus Diskussionen rund um Für und Wider der Standardfunktionen für reines "C" halte ich mich i.A. heraus, allerdings würde ich ein C++-Programm nicht die Qualitätssicherung passieren lassen, wenn solche Funktionen darin direkt verwandt würden.
Aber C++ ist ein anderes Thema.
Sinnvoll könnte es hier aber sein, sich über UNICODE zumindest Gedanken zu machen; bei den meisten Code-Beispielen für Einsteiger wird darauf nicht geachtet, aber UNICDOE spielt in der C/C++-Praxis eine erhebliche Rolle.
Ferner sind bei der Standardbibliothek Aspekte der Nebenläufigkeit(aka "Concurrency", "Multi-Threading") zu bedenken wenn die Anwendungen komplexer werden.
Grüsse
Solkar
P.S.: Ungarische Notation, z.B. "psz<Irgendwas>" oder i<Irgendwas> ist natürlich nicht Pflicht und auch sehr unumstritten im Praxiseinsatz, aber ich habe die Erfahrung gemacht, dass dies Einsteigern hilft, die Übersicht zu behalten.