frankx: Anfängerfrage zu Strings in C

Beitrag lesen

Hellihello

  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
  
#ifndef LINELEN  
#define LINELEN 80  
#endif  
  
#ifndef SEPARATOR  
#define SEPARATOR ','  
#endif  
  
#ifndef LINEEND  
#define LINEEND '\n'  
#endif  
  
/***  
 * getCommaCount  
 * zählt die Anzahl der Kommata  
 *  
 * @param line   Zeiger auf eine Zeichenkette  
 * @return       Anzahl der Kommata  
 */  
int getCommaCount(char* line) {  
 int commaCount = 0;  
 while(*line++) {  
  if(*line== SEPARATOR) {  
   commaCount++;  
  }  
 }  
 return commaCount;  
}  
  
/***  
 * setCells  
 * zählt die Anzahl der Kommata  
 *  
 * @param line   Zeiger auf eine Zeichenkette  
 */  
int setCells(char** result, char* line) {  
 int charCount = 0;  
 int cellCount = 0;  
 while(*line) {  
  if(*line!= SEPARATOR && *line!= LINEEND) {  
   result[cellCount][charCount] = *line;  
   charCount++;  
  } else {  
   result[cellCount][charCount] = 0;  
   cellCount++;  
   result[cellCount] = result[cellCount-1] + (charCount+1)*sizeof(char*);  
   charCount=0;  
   }  
  *line++;  
 }  
}  
  
  
/***  
 * SplitLinesCsv  
 * splittet eine Textzeile am Komma auf,  
 * füllt die Teilzeichenketten in result  
 *  
 * @param line   Zeiger auf eine Zeichenkette  
 * @param result Adresse eines Zeigers auf ein Array von Zeichenketten  
 * @return       Anzahl der Teilzeichenketten  
 *  
 * Seiteneffekt: Speicher auf dem Heap wird allokiert  
 */  
int SplitLinesCsv(char* line, void* result) {  
 int cellCount = 0;  
 int lineLength = strlen(line);  
 char*** pointerToResult = result;  
  
 //~ printf("[SplitLinesCsv] result as int: '%d'\n", result);  
 // Ermittle, wieviele Teilzeichenketten es gibt  
 cellCount = getCommaCount(line) + 1; // one more than commas  
  
 // Allokiere den Speicher für das notwendige Array von Zeigern auf char  
 *pointerToResult = malloc(cellCount * sizeof(char*));  
  
 // Allokiere für jede Teilzeichenkette den notwendigen Speicher  
  *pointerToResult[0]=malloc(lineLength * sizeof(char)); //allocated memory will not be longer than orginial line;  
  
 // Ermittle die Teilzeichenketten  
    // ...  
 setCells(*pointerToResult, line);  
 return cellCount;  
}  
  
int  
main()  
{  
 char* line = "nickname,vorname,nachname,1970\n";  
 char** result;  
 int cellCount;  
 printf("[main] &result as int: '%d'\n", &result);  
 //~ printf("[main] result as int: '%d'\n", result);  
 cellCount = SplitLinesCsv(line, &result);  
 while (cellCount > 0) {  
  printf("[main] result[%d] as string: '%s'\n", cellCount-1, result[cellCount-1]);  
  cellCount--;  
 }  
 return 0;  
}  
  

wäre ein Veruch hierzu.

komisch nur, dass ich

"printf("[main] &result as int: '%d'\n", &result);" in main starten muss, oder aber
ohne den "&" oder aber in SplitLineCSV "printf("[SplitLinesCsv] result as int: '%d'\n", result);".

Sonst kommt am Ende murx raus:

[main] result[3] as string: '1970'
[main] result[2] as string: ''1970'
'
[main] result[1] as string: 'kreismitpfeil'
[main] result[0] as string: 'nickname'

statt wie eigentlich erwartet:

[main] &result as int: '2280672'
[main] result[3] as string: '1970'
[main] result[2] as string: 'nachname'
[main] result[1] as string: 'vorname'
[main] result[0] as string: 'nickname'

und der Unterschied nur wegen eines "printf()", allerdings mit result als Parameter. Wird das dadurch irgendwie "initialisiert"? Komisch, dass das dicke Ende dann doch immer nochmal kommt.

Dank und Gruß,

frankx

--
tryin to multitain  - Globus = Planet != Welt