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

Résolu
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008 - 24 mai 2005 à 15:00
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008 - 30 mai 2005 à 11:15
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

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
26 mai 2005 à 19:14
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;

}
3
MNEMONIC Messages postés 59 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 1 septembre 2006
24 mai 2005 à 17:48
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
}
0
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008
25 mai 2005 à 08:48
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
0
MNEMONIC Messages postés 59 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 1 septembre 2006
25 mai 2005 à 13:18
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...?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008
25 mai 2005 à 14:46
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 !
0
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008
25 mai 2005 à 15:01
ç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 !
0
MNEMONIC Messages postés 59 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 1 septembre 2006
25 mai 2005 à 17:27
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...?
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
25 mai 2005 à 19:22
Ca ne compile pas avec un compilateur C, et meme si ca compile avec un compilateur C++ ce code est incorrecte en C++.
0
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008
26 mai 2005 à 08:53
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 !
0
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008
27 mai 2005 à 09:13
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
0
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008
27 mai 2005 à 09:15
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 ;)
0
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008
27 mai 2005 à 09:59
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 !!!
0
boudafc Messages postés 48 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 18 juillet 2008
30 mai 2005 à 11:15
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 ...
0
Rejoignez-nous