solkar: Einige C-Antworten; insb. zu sscanf

Beitrag lesen

Da hätte ich jetzt noch glatt etwas vergessen.
Angenommen ich habe ein String mit dem Format: NAME,ORT,ALTER

Warum 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.