Pb c structure et pointeur.
macbang
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,
je fait appel à vous pour un problème que j'ai du mal a résoudre.
Mon programme ouvre un fichier, le but étant de découper ligne par ligne pour placer des infos dans une structure.
voici une ligne type :
18:02:05 adresseIP "01234#description"
je veux récupérer les infos de l'heure, l'adresse IP, l'ID de l'erreur puis sa description.
j'effectue la découpe dans une fonction.
La structure est une variable globale , pour pouvoir la récupérer ensuite, je suis obligé de la passé en pointeur.
je la déclare dans le main :
type struct infos
{
char *IP;
char *heure;
char *erreur;
char *description
}infos;
infos lignes[500];
prototype de ma fonction :
int decoupage (infos *lignes[]);
variables:
j'appel ma fonction dans le main comme ceci.
k = decoupage(lignes)
Enfin voici la fonction decoupage (après ouverture avec succès du fichier texte):
int decoupage (infos *lignes[])
{
char *texte[100];
char *pointeur;
int i=0;
voici les séparateurs que j'ai utilisé :
char *sep1={"\t"};
char *sep2={"\""};
char *sep3={"#"};
char *sep4={"\r\n"};
while ( fgets (texte,sizeof texte,fichier) != NULL )
{
i++;
pointeur = strtok (ligne,sep1);
strcpy( ligne[i].heure , pointeur);
pointeur = strtok (NULL,sep1);
strcpy( ligne[i].IP , pointeur);
pointeur = strtok (NULL,sep2);
pointeur = strtok (NULL,sep3);
strcpy( ligne[i].erreur , pointeur);
pointeur = strtok (NULL,sep2);
strcpy( ligne[i].description , pointeur);
}
}
Ceci plante lors du strcpy, j'ai essayé avec un ligne[i]->IP = pointeur; et cela plante aussi.
Pourriez vous me débloquer ? Merci
je fait appel à vous pour un problème que j'ai du mal a résoudre.
Mon programme ouvre un fichier, le but étant de découper ligne par ligne pour placer des infos dans une structure.
voici une ligne type :
18:02:05 adresseIP "01234#description"
je veux récupérer les infos de l'heure, l'adresse IP, l'ID de l'erreur puis sa description.
j'effectue la découpe dans une fonction.
La structure est une variable globale , pour pouvoir la récupérer ensuite, je suis obligé de la passé en pointeur.
je la déclare dans le main :
type struct infos
{
char *IP;
char *heure;
char *erreur;
char *description
}infos;
infos lignes[500];
prototype de ma fonction :
int decoupage (infos *lignes[]);
variables:
j'appel ma fonction dans le main comme ceci.
k = decoupage(lignes)
Enfin voici la fonction decoupage (après ouverture avec succès du fichier texte):
int decoupage (infos *lignes[])
{
char *texte[100];
char *pointeur;
int i=0;
voici les séparateurs que j'ai utilisé :
char *sep1={"\t"};
char *sep2={"\""};
char *sep3={"#"};
char *sep4={"\r\n"};
while ( fgets (texte,sizeof texte,fichier) != NULL )
{
i++;
pointeur = strtok (ligne,sep1);
strcpy( ligne[i].heure , pointeur);
pointeur = strtok (NULL,sep1);
strcpy( ligne[i].IP , pointeur);
pointeur = strtok (NULL,sep2);
pointeur = strtok (NULL,sep3);
strcpy( ligne[i].erreur , pointeur);
pointeur = strtok (NULL,sep2);
strcpy( ligne[i].description , pointeur);
}
}
Ceci plante lors du strcpy, j'ai essayé avec un ligne[i]->IP = pointeur; et cela plante aussi.
Pourriez vous me débloquer ? Merci
A voir également:
- Pb c structure et pointeur.
- Pointeur souris - Guide
- Curseur Windows 10 : comment bien voir la souris à l'écran - Guide
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Structure d'un rapport de stage - Guide
- Trouvez l'erreur dans la structure du document et corrigez-la. - Forum Word
10 réponses
tu as raison, le new vient du C++.... généralement, les gens qui travaillent en C utilisent quand meme un compilo c++...
alors en C, il faut utiliser un malloc, et ca donne un truc du genre:
ligne[i]->heure= (char*) malloc (strlen(pointeur)+1);
alors en C, il faut utiliser un malloc, et ca donne un truc du genre:
ligne[i]->heure= (char*) malloc (strlen(pointeur)+1);
a première vu, il semble que tu utilises un strcpy pour copier uen chaine dans ta structure (sur un char*) ... c'est bien... mais à aucun moment, je ne vois l'allocation mémoire pour la chaine que tu copies!!!
essayes un truc du genre
pointeur = strtok (ligne,sep1);
ligne[i].heure= new char[strlen(pointeur)+1];
strcpy( ligne[i].heure , pointeur);
et ce, à chaque fois que tu vas faire un strcpy ...
bien sur, il ne faudra pas oublier de faire un delete pour chaque allocation qui as été faite, en fin de fonction (pas de ramasse miettes en C !!!)
essayes un truc du genre
pointeur = strtok (ligne,sep1);
ligne[i].heure= new char[strlen(pointeur)+1];
strcpy( ligne[i].heure , pointeur);
et ce, à chaque fois que tu vas faire un strcpy ...
bien sur, il ne faudra pas oublier de faire un delete pour chaque allocation qui as été faite, en fin de fonction (pas de ramasse miettes en C !!!)
comment dois-je déclarer le new char ?
le compilateur me dit que ce dernier (new) n'est pas déclaré.
je tiens à préciser que j'ai fait une petite erreur dans le post d'avant.
La structure étant passé en pointeur, mes lignes sont avec des " -> " et non des " . "
strcpy( ligne[i]->heure , pointeur);
si cela influe sur quelque chose ...
le compilateur me dit que ce dernier (new) n'est pas déclaré.
je tiens à préciser que j'ai fait une petite erreur dans le post d'avant.
La structure étant passé en pointeur, mes lignes sont avec des " -> " et non des " . "
strcpy( ligne[i]->heure , pointeur);
si cela influe sur quelque chose ...
A oui effectivement, un malloc serait le bienvenue.
par contre, ca plante lors de son allocation :
ligne[i]->heure = (char*) malloc (strlen(pointeur)+1);
pourtant la déclaration me parait bien, je comprends pas trop...
par contre, ca plante lors de son allocation :
ligne[i]->heure = (char*) malloc (strlen(pointeur)+1);
pourtant la déclaration me parait bien, je comprends pas trop...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
j'ai déclarer plutot le malloc de cette manière :
ligne[i]->heure = malloc (sizeof (strlen(pointeur)+1) );
mais cette allocation plante toujours...
je passe pourtant bien en argument &infos ...
je comprends pas ce qui cloche.
ligne[i]->heure = malloc (sizeof (strlen(pointeur)+1) );
mais cette allocation plante toujours...
je passe pourtant bien en argument &infos ...
je comprends pas ce qui cloche.
sizeof(strlen) ne marchera pas: strlen renvoie un entier: 4 octets: il te réservera tjs 4 octets !
type struct infos
{
char IP[500];
char heure[500];
char erreur[500];
char description[500]
}infos;
sans malloc (pour les tests)
type struct infos
{
char IP[500];
char heure[500];
char erreur[500];
char description[500]
}infos;
sans malloc (pour les tests)
Cela ne fonctionne toujours pas.
Par contre dans ma structure, les déclarations des char sont des pointeurs non ?
type struct infos
{
char *IP[500];
char *heure[500];
char *erreur[500];
char *description[500]
}infos;
ensuite
infos ligne[50];
ensuite j'appel
k = decoupage (ligne); (sans &) ?
Par contre dans ma structure, les déclarations des char sont des pointeurs non ?
type struct infos
{
char *IP[500];
char *heure[500];
char *erreur[500];
char *description[500]
}infos;
ensuite
infos ligne[50];
ensuite j'appel
k = decoupage (ligne); (sans &) ?
essai simplement avec :
int decoupage (infos *lignes);
ne pas oublier que même si c'est pas pareil, un tableau et un pointeur c'est très similaire.
C'est à dire que si lignes est un tableau de 500 infos, alors ligne peut être vu comme un pointeur. Écrire (infos *lignes[]) veux dire que lignes est un tableau de info* (de type pointeurs vers infos).
int decoupage (infos *lignes);
ne pas oublier que même si c'est pas pareil, un tableau et un pointeur c'est très similaire.
C'est à dire que si lignes est un tableau de 500 infos, alors ligne peut être vu comme un pointeur. Écrire (infos *lignes[]) veux dire que lignes est un tableau de info* (de type pointeurs vers infos).
Salut,
C'est dommage de te compliquer avec des allocations de pointeurs alors que la taille de l'heure sous la forme hh:mm:ss a une taille fixe et l'IP une taille maximum. Pour le numéro de l'erreur tu peux utiliser un int. Et enfin pour la description, je te conseille d'utiliser un buffer de taille fixe. Néanmoins, si tu souhaites économiser au maximum la mémoire, tu peux utiliser un pointeur pour ce dernier, mais attention à l'allocation.
Je te donne un code bien plus court qui devrait marcher (flemme de tester) ^^ :
<co#include <stdio.h>
typedef struct infos {
char time[9];
char ip[16];
int num;
char description[128];
} infos;
int main(void) {
info mes;
const char* ch="18:02:05 192.168.1.1 \"01234#description\"";
if(sscanf(ch,"%8s %15s \"%d#%127[^\"]",mes.time,mes.ip,&mes.num,mes.description)==4) {
/* il ne te reste plus qu'à afficher */
}
return 0;
}
</code>
Il ne te reste plus qu'à adapter ;-))).
C'est dommage de te compliquer avec des allocations de pointeurs alors que la taille de l'heure sous la forme hh:mm:ss a une taille fixe et l'IP une taille maximum. Pour le numéro de l'erreur tu peux utiliser un int. Et enfin pour la description, je te conseille d'utiliser un buffer de taille fixe. Néanmoins, si tu souhaites économiser au maximum la mémoire, tu peux utiliser un pointeur pour ce dernier, mais attention à l'allocation.
Je te donne un code bien plus court qui devrait marcher (flemme de tester) ^^ :
<co#include <stdio.h>
typedef struct infos {
char time[9];
char ip[16];
int num;
char description[128];
} infos;
int main(void) {
info mes;
const char* ch="18:02:05 192.168.1.1 \"01234#description\"";
if(sscanf(ch,"%8s %15s \"%d#%127[^\"]",mes.time,mes.ip,&mes.num,mes.description)==4) {
/* il ne te reste plus qu'à afficher */
}
return 0;
}
</code>
Il ne te reste plus qu'à adapter ;-))).