IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Fonction strtok sans strtok


Sujet :

C

  1. #1
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut Fonction strtok sans strtok
    Bonjour à vous,

    Cela m'agace. Je n'arrive pas à faire une fonction simple en C, pourtant mon langage de base au lycée. Bon. Cela fait deux ans que je fais du VB mais là, cela m’énerve.

    Voila : je voudrais recréer une fonction identique au strtok mais sans ce dernier car mon logiciel est en multithread.

    Je reçois une chaîne de caractères qui est en fait plusieurs chaînes séparées par 0x0D et 0x0A. Je dois donc les découper.

    Ce que je cherche à faire, c'est donc récupérer la 1ère partie jusqu'au séparateur. Et me retourner en même temps le restant de la trame afin que je puisse de nouveau la passer à la moulinette pour le suivant, etc.

    Voila ce que j'ai effectué pour le moment mais j'ai un défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    char* tokString (char* Linetok, char* sep)
    {
    	int index = -1;
    	char *new_s = NULL;
    	char lineReturn[strlen(Linetok)];
    	//recherche de l'index du 1er séparateur
    	if (Linetok != NULL && sep != NULL)
    	{
    	  char *ptr_pos = NULL;
     
    	  ptr_pos = strstr (Linetok, sep);
    	  if (ptr_pos != NULL)
    	  {
    		 index = ptr_pos - Linetok;
    	  }
    	}
    	if (index > 0 ){
    		new_s = malloc (sizeof (*new_s) * (index + 2));
    		if (new_s != NULL)
    		{
    			int i;
    			for (i = 0; i <= index; i++){
    				if (Linetok[i] != '\x0D'){
    					new_s[i] = Linetok[i];
    				}else{
    					new_s[i] = '\0';
    				}
     
    			}
    			for (i = 0; i >= strlen(Linetok) - index; i ++){
    				lineReturn[i] = Linetok[i + index];
    			}
    			lineReturn[i] = '\0';
     
    			Linetok = strcpy(Linetok,lineReturn);
    			return new_s;
    		}else{
    			return NULL;
    		}
    	}else{
    		return NULL;
    	}
    }
    Je continue à chercher car j'ai besoin de cette fonction. Si je trouve avant une info, merci de me dire si vous voyez quelque chose à améliorer.

    Merci.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par megamario
    Voila je voudrais recrée une fonction identique au strtok mais sans ce dernier car mon logiciel est en multithread.
    Si c'est juste pour cette raison, tu n'as qu'à utiliser strtok_r si tu développes pour *n*x et strtok_s si tu développes pour Windows. Les deux fonctions s'utilisent de la même façon. A moins que ça soit plutôt pour t'amuser ? Ou pour t'entraîner ?

  3. #3
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Citation Envoyé par Melem Voir le message
    Si c'est juste pour cette raison, tu n'as qu'à utiliser strtok_r si tu développes pour *n*x et strtok_s si tu développes pour Windows. Les deux fonctions s'utilisent de la même façon. A moins que ça soit plutôt pour t'amuser ? Ou pour t'entraîner ?
    Bonjour et merci pour ces 2 fonctions que je connaissais pas.

    En faite je développe pour un linux embarqué je vais regarder si la fonction strtok_r existe, par contre j'aimerais quand même y arriver


    [Edit] - Cela fonctionne parfaitement avec strtok_r merci pour l'info. Je vais pouvoir avancer sur mon projet, mais je vais regarder cela à la maison car je veux et doit pouvoir faire cette fonction, cela parait pas si compliqué pourtant.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 874
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par megamario Voir le message
    car je veux et doit pouvoir faire cette fonction, cela parait pas si compliqué pourtant.
    Salut
    Le problème de strtok() est qu'il mémorise sa position dans la chaine à exploser (pour pouvoir repartir de là lors de l'appel suivant) dans une variable statique. Et donc en environnement multithread avec mémoire commune, avec une seule variable pour gérer plusieurs appels en parallèles ne peut pas marcher. Remarque le problème est le même sans multithread simplement si tu appelles strtok() pour 2 chaines différentes que tu veux traiter en parallèle ; ou si tu utilises strtok pour exploser une sous-chaine elle-même issue de strtok (exemple: énumérer tous les répertoires des différents dossiers du PATH)

    La différence de strtok_r() est que c'est toi qui lui passes le buffer destiné à mémoriser le travail en cours. Donc tu peux traiter 5000 chaines en parallèle si tu prends la précaution de prévoir 5000 buffers distincts.

    Et donc si tu veux la programmer toi-même tu as là toutes les billes. Te suffit de faire un truc ressemblant grosso-modo à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    partir de la dernière position mémorisée du buffer ou du début de la chaine si le buffer est nul
    parcourir chaque caractère
    si caractère vaut caractère de séparation alors le remplacer par un '\0', mémoriser la position suivante dans le buffer et renvoyer l'adresse où on a commencé à traiter la chaine
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Exécuter une fonction onClick sans cliquer
    Par Le Touriste dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/06/2009, 01h13
  2. Fonction Tribonacci sans boucle
    Par pAnTiNhO dans le forum Langage
    Réponses: 7
    Dernier message: 25/12/2008, 14h25
  3. Réponses: 4
    Dernier message: 02/06/2004, 17h35
  4. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 19h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo