[C] Parser une chaine de caractères à l'aide d'un mask

Statut
N'est pas ouverte pour d'autres réponses.

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.

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);
}
exemple d'utilisation:
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);
il faut biensur ne pas oublier de libérer la mémoire

Code:
FreeParseResult(nString, &Result);
affichage du résultat (utilisation de ma fonction print_r):

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];
on vois bien que les morceau noté par un ? dans le mask on été extrait ;)
 

null

ose();
Quel est l'avantage d'utiliser size_t au lieu d'unsigned int ? (à part le fait que ça soit plus court à écrire :-D)
 

Jereck

Α & Ω
Staff
null a dit:
Quel est l'avantage d'utiliser size_t au lieu d'unsigned int ? (à part le fait que ça soit plus court à écrire :-D)
Me semble que certains compilateurs mettront un warning avec un unsigned int tout simplement.
 
1er
OP
neku

neku

Codeur roumain
null a dit:
Quel est l'avantage d'utiliser size_t au lieu d'unsigned int ? (à part le fait que ça soit plus court à écrire :-D)
size_t est un unsigned long int
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut