neku
Codeur roumain
Voici une fonction fort bien utile, qui vous permettra de découper une chaine de caractères à l'aide d'un mask.
exemple d'utilisation:
je l'ai conçue à la base pour parser les log RCON
il faut biensur ne pas oublier de libérer la mémoire
affichage du résultat (utilisation de ma fonction print_r):
on vois bien que les morceau noté par un ? dans le mask on été extrait 
Code:
size_t ParseString(char*** strings, const char* buffer, const char* mask, size_t BUFFER_SIZE) {
//Make delimiters table
size_t delimiters_count = 0;
size_t delimiters_max = 0;
size_t strings_count = 0;
for (size_t i = 0; i < strlen(mask); i++) {
if (mask[i] != '?') {
delimiters_count++;
delimiters_max++;
}
else
strings_count++;
}
char* delimiters = (char*)malloc(sizeof(char) * delimiters_count);
delimiters_count = 0;
for (size_t i = 0; i < strlen(mask); i++) {
if (mask[i] != '?') {
delimiters[delimiters_count] = mask[i];
delimiters_count++;
}
}
*strings = (char**)malloc(sizeof(char*) * strings_count);
delimiters_count = 0;
size_t nstring = 0;
size_t pos_start = 0;
size_t pos_end = 0;
for (size_t i = 0; i <= strlen(buffer); i++) {
if (buffer[i] == delimiters[delimiters_count] || i == strlen(buffer)) {
pos_end = i;
if (pos_end != pos_start) {
(*strings)[nstring] = (char*)malloc(sizeof(char) * BUFFER_SIZE);
strncpy((*strings)[nstring], buffer + pos_start, pos_end - pos_start);
(*strings)[nstring][pos_end - pos_start] = 0;
nstring++;
}
delimiters_count++;
pos_start = pos_end + 1;
}
if (delimiters_count == delimiters_max)
break;
if (nstring == strings_count)
break;
}
free(delimiters);
return nstring;
}
void FreeParseResult(int n, char*** result) {
for (size_t i = 0; i < n; i++) {
free((*result)[i]);
}
*result = NULL;
free(*result);
}
je l'ai conçue à la base pour parser les log RCON
Code:
char** Result = NULL;
size_t nString = ParseString(&Result,
"xxxxlog L 01/18/2008 - 01:31:54: \"Neku2<51><VALVE_ID_LAN><>\" connected, address \"192.168.1.101:27005\"",
"xxxxlog L ? - ? \"?<?><?><>\" connected, address \"?\"", 256);
Code:
FreeParseResult(nString, &Result);
Code:
Result (0x100180) = {
[0] (0x100180) => 01/18/2008
[1] (0x100184) => 01:31:54:
[2] (0x100188) => Neku2
[3] (0x10018c) => 51
[4] (0x100190) => VALVE_ID_LAN
[5] (0x100194) => 192.168.1.101:27005
}[6];