Strtok problem

Fermé
emmy_2019 Messages postés 59 Date d'inscription mardi 23 avril 2019 Statut Membre Dernière intervention 16 septembre 2019 - 25 juin 2019 à 12:07
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 25 juin 2019 à 14:57
Bonjour,

J'ai un petit soucis avec la fonction strtok:

j'ai un fichier Config.ini(sur WinCE je n'ai pas trouvé des fonction pour le parser et du coup j'utilises l''alogorithme normal pour la lecture d'un fichier)

fichier:
;-----
;Fichier de configuration des adresses IP pour le compteur IRIS(CONFIG_IP_IRIS.ini)
;----
[IRIS]
Adrr_CALC=192.168.0.95
Addr_TCP_IRMA1=192.168.0.132
Addr_TCP_IRMA2="192.168.0.131
Addr_TCP_IRMA3=192.168.0.132 
-


code source:

ip_adress_t cpiris_lecture_config_ip(ip_adress_t adress)
{
	char tmp[512];
	wchar_t file_name[512];
	FILE *file_id;
	char * token=NULL;

	//le path de fichier CONFIG_IP_IRIS.ini
	swprintf(file_name, L"%S%S", path_commun, CONFIG_IP_IRIS);
	//wprintf(L"File_Name = %s  \n", file_name);
	//Ouverture du fichier
	if((_wfopen_s(&file_id, file_name, L"r")) != 0)
	{
		 /* obtenir le code d'erreur */
		 DWORD error_id = GetLastError();
		send_log("cpiris_lecture_config_ip failed: with error code %lu\n", error_id);
	}
	else
	{
		//Lecture du fichier ligne par ligne et remplissage de structure 
		while(fgets(tmp, sizeof(tmp), file_id) != NULL)
		{

			send_log("cpiris_lecture_config_ip tmp is %s\n", tmp);
			if((strstr(tmp, "Adrr_CALC")) != NULL)
			{
				token = strtok(tmp, "Adrr_CALC=");
				send_log("cpiris_lecture_config_ip tmp cal is %s\n", token);
				strcpy(adress.ip_calc,token);
			}
			else if((strstr(tmp, "Addr_TCP_IRMA1=")) != NULL)
			{
				//send_log("cpiris_lecture_config_ip tmp1 is %s\n", tmp);
				token = strtok(tmp, "Addr_TCP_IRMA1=");
				send_log("cpiris_lecture_config_ip tmp 1 is %s\n", token);
				strcpy(adress.ip_irma_1,token);
			}
		
		
		}
	}
	fclose(file_id);
	//send_log("cpiris_lecture_config_ip adress.ip_calc is %s ip_irma_1=%s, ip_irma_2=%s, ip_irma_3=%s\n", adress.ip_calc, adress.ip_irma_1, adress.ip_irma_2, adress.ip_irma_3);
	return adress;
	
}



Resultat:
cpiris_lecture_config_ip tmp cal is 192.168.0.95

- cpiris_lecture_config_ip tmp is Addr_TCP_IRMA1=192.168.0.130

cpiris_lecture_config_ip tmp 1 is 92.
- cpiris_lecture_config_ip tmp is Addr_TCP_IRMA2=192.168.0.131

- cpiris_lecture_config_ip tmp 2 is 19
cpiris_lecture_config_ip tmp is Addr_TCP_IRMA3=192.168.0.132


cpiris_lecture_config_ip tmp 3 is 192.168.0.1


Avez-vous une idée pourquoi j'ai eu 92.(pour 192.168.0.130) , 19(pour 192.168.0.132) et 192.168.0.1(pour 192.168.0.132)?
Je vous remercie par avance.



Configuration: Windows / Chrome 75.0.3770.100

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 25 juin 2019 à 14:23
Salut emmy_2019,

Ce n'est pas comme cela que l'on se sert de
strtok()
:

http://www.cplusplus.com/reference/cstring/strtok/

et je ne l'utiliserai pas personnellement dans ton cas.

Il te suffit d'utiliser
strstr()
, qui va renvoyer le pointeur vers l'endroit où se trouve la sous-chaîne qui correspond à ta recherche et d'y ajouter la longueur de ta sous-chaîne pour te positionner au char suivant.

Voilà un exemple :

#include <stdio.h>
#include <string.h>

int main(void) {
    char * st = "Adrr_CALC=192.168.0.95";
    char * found = NULL;

    if ((found = strstr(st, "Adrr_CALC="))) {
        found = found + strlen("Adrr_CALC=");
        printf("value is: %s\n", found);
    }

    return 0;
}

qui donne :

$ gcc -Wall 36090951.c
$ ./a.out 
value is: 192.168.0.95

Sinon, pour parser un fichier .ini, il y a cette fonction dédiée de l'API Windows, qui est en legacy car elle était utilisée par les systèmes 16 bits avant l'apparition du registre Windows.

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprivateprofilestring

Si elle existe sur ton WinCE, tu devrais sans doutes l’utiliser.

Dal
0
emmy_2019 Messages postés 59 Date d'inscription mardi 23 avril 2019 Statut Membre Dernière intervention 16 septembre 2019
25 juin 2019 à 14:34
Merci Dal je vais essayé ta solution
malheureusement cela n'existait pas sur WinCe 6.0 j'ai eu une erreur fonction non définie
0
emmy_2019 Messages postés 59 Date d'inscription mardi 23 avril 2019 Statut Membre Dernière intervention 16 septembre 2019
25 juin 2019 à 14:43
Dal stp je récupère la chaine mais à la fin il y'a un catère de retour à la ligne que je vois ce n'est pas normale puisque je vais utiliser cette adresse dans une requête http
As-tu une idée pour enlever tout chariot stp?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
25 juin 2019 à 14:57
OK, de rien.

Dans ton cas, vu que tes données viennent d'un fichier, tu auras des retours à la ligne
\n
dans les données lues par
fgets()
.

Si tu n'en veux pas, tu peux les supprimer en en cherchant l'existence avec
strchr()
et en terminant la chaîne à cet endroit.

Cela donne ceci dans mon code d'exemple :

#include <stdio.h>
#include <string.h>

int main(void) {
    char st[] = "Adrr_CALC=192.168.0.95\n";
    char * found = NULL;                                                        

    if ((found = strstr(st, "Adrr_CALC="))) {
        found = found + strlen("Adrr_CALC=");

        /* remove trailing \n if it is there */
        char * newline = NULL;
        if ((newline = strchr(found, '\n')))
            *newline = '\0';

        printf("value is: [%s]\n", found);
    }

    return 0;
}
0