Récupérer string pointée par un pointeur, strtok

[Résolu]
Signaler
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008
-
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008
-
Voilà, j'ai un pb dont je ne trouve pas la solution ! je galère, ça fait 2 jours ...

donc, ce que je voudrais faire (je suis sûr que c'est tout con en + ...) c'est stocker une string pointée par un pointeur, je m'explique, j'utilise la fonction strtok, et je voudrais stocker les sous-chaines dans une variable en vue de mettre en forme les données, et faire des traitements.
J'ai essayé de le passer dans une string mais ça plante ...

Voici mon bout de code:
----------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


main()
{
char phrase[] = "14.139.11.17 - moi [01/Jan/2004:01:00:03 +0000] 'images/img.gif ' 404";
int i;
char * pointeur;
pointeur = strtok(phrase," -");
i = 0;
while (pointeur != NULL)
{
switch(i)
{
case 0 : c'est là que je sais pas quoi mettre = *pointeur;
break;

case 1 :
break;

case 2 :
break;
....
}

printf("%s\n",pointeur);
pointeur = strtok(NULL,"- [:]'");
i = i+1;
}
}
-----
Merci de votre aide, car je désespère ...

13 réponses

Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
Tu veux faire quoi exactement (sans parler de code, parce que strtok n'est pas la meilleur solution a mon avis) ?

En C ou en C++ ?



Tu voudrais pas faire ca tout simplement ? (en C)



#include <stdio.h>



int main()

{

const char phrase[] = "14.139.11.17 - moi [01/Jan/2004:01:00:03 +0000] 'images/img.gif ' 404";

char ip[16];

char login[20];

char date[12];

char chemin[200];



sscanf( phrase, "%s - %s [%11s:%*s %*s '%s'", ip, login, date, chemin );



puts( ip );

puts( login );

puts( date );

puts( chemin );



return 0;

}
Messages postés
59
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2006

J'ai fait ça et ça marche...

#include <stdio.h>
#include <stdlib.h>
#include <string> //Modif


main()
{
char phrase[] = "14.139.11.17 - moi [01/Jan/2004:01:00:03 +0000] 'images/img.gif ' 404";
int i;
char * pointeur;
std::string toto; //Ajout
pointeur = strtok(phrase," -");
i = 0;
while (pointeur != NULL)
{
switch(i)
{
case 0 : toto= *pointeur; //modif
break;

case 1 :
break;

case 2 :
break;
// ....
}

printf("%d %s\n",i,pointeur); //modif
pointeur = strtok(NULL,"- [:]'");
i = i+1;
}
system("pause"); //ajout
}
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008

Merci pour ta réponse, mais ça ne marche pas chez moi,

je ne comprend pas très bien ce que c'est : std::string toto; //Ajout
Messages postés
59
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2006

std::string
Utilisation du type string défini dans le namespace std
toto
variable à la noix :) mais je suppose que tu avais compris

Bon, sinon, j'ai compilé ça avec dev-cpp, et ça me donne bien tous les éléments de phrase...
Qu'est-ce que tu obtiens qui ne marche pas...?
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008

comme erreur, il me met:

10 D:\DONNEES\C\main.c syntax error before ':' token

(et j'ai dû rajouter le .h au #include <string> )

sniff ...

Merci encore !
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008

ça y est !! j'ai trouvé, en fait, je crois que c'était tout bête, j'avais oublié que pour copier des strings, il fallait utiliser la fonction: strcpy ...
voilà du coup:

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


main()
{
char phrase[] = "14.139.11.17 - moi [01/Jan/2004:01:00:03 +0000] 'images/img.gif ' 404";
int i;
char * pointeur;
char ip[16];
char login[20];
char date[12];
char chemin[200];

pointeur = strtok(phrase," -");
i = 0;
while (pointeur != NULL)
{
switch(i)
{
case 0 : strcpy(ip,pointeur);
break;
case 1 : strcpy(login,pointeur);
break;
case 2 : strcpy(date,pointeur);
break;
case 7 : strcpy(chemin,pointeur);
break;
}
//printf("%d %s\n",i,pointeur); //modif


pointeur = strtok(NULL,"- [:]'");


i = i+1;


}
printf("IP: %s\n",ip);
printf("Login: %s\n",login);
printf("Date: %s\n",date);
printf("Chemin: %s\n",chemin);
system("pause"); //ajout
}


--------------------------------------------
Par contre, je ne vois toujours pas ce que c'est: std::string et le namespace...

Merci encore !
Messages postés
59
Date d'inscription
dimanche 19 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2006

namespace : espace de nommage...
en gros, tu peux définir un même nom de variable dans des espaces de nomage différents, et donc appeler le bon à tout moment...
donc en fait, en faisant std::string, tu utilises le type string de l'espace std

Pour le code, j'ai essayé le même que je t'avais passé avec VC++6, et j'ai toujours le bon résultat...
Par curiosité, tu utilises quel compilo...?
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
Ca ne compile pas avec un compilateur C, et meme si ca compile avec un compilateur C++ ce code est incorrecte en C++.
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008

Merci pour l'explication ! c'est encore un peu brouillé parce que je suis encore un peu novice ...


Sinon, jJ'utilise Dev-C++


Sinon, steve_clamage, quel code est incorrect ?


Merci encore de votre aide !
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008

En fait, ce que je dois faire c'est un logiciel d'analyse de fichiers log.
C'est-à-dire que j'ai un cahier des charges qui me dit qu'il faut que j'enlève certaines IP (ça je l'ai fait) et aussi, que je garde que les chemins qui m'interessent (enfin, qui les interessent) et tout ça mettre en forme pour ensuite les exploiter avec par exemple excel pour faire des graph
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008

Le pb, c'est que je pensait avoir trouvé la solution (cf. plus haut) mais en fait, toutes les lignes du log ne sont pas identiques ... donc faut que je cherche un peu

par exemple :

132.149.11.117 - - [01/Jan/2004:01:00:03 +0000] "GET /SurveillanceServeur.iw3" 404 -
132.149.11.117 - moi [01/Jan/2004:02:00:02 +0000] "GET /SurveillanceServeur.iw3" 404 -
213.100.236.157 - - [01/Jan/2004:04:03:04 +0000] "GET /M83A HTTP/1.0" 404 198

tu vois, ... des fois y a HTTP/1.0 des fois non ... et donc, faut que je trouve une methode ...

par contre, ton sscanf m'interesse, je vais essayer de voir sur le msdn ;)
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008

hummm, je crois que tu m'a sauvé la vie !!!!
en effet, je crois que c'est la fonction sscanf qui me fallait !!!

je vais encore faire 2-3 tests et je reviendrais poster ;)

MERCI ENCORE !!!
Messages postés
48
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
18 juillet 2008

Bon, eh ben, ça marche impec !!! merci encore !!!

Par contre, je m'apperçois, que lorsqu'il n'y a pas d'espace, il faut définir le nb de caractère, sinon, sscanf ne s'en sort pas ...