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ß,