[C] Modification indésirable d'un pointeur
Tanynep
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
Tanynep Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
Tanynep Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
dans un petit programme en C, j'avais un problème avec la fonction fgets donc j'ai voulu la réécrire... mais là n'est pas la question. Le prototype de ma fonction est le suivant :
void fgets_perso(char* lu, int n_max, FILE* f);
lu est un pointeur sur la chaîne lue dans le fichier. Les seules opérations effectuées sur lu sont une initialisation à '\0' et une concaténation (strcat) avec les caractères lus un à un. Pourtant, quand je sors de ma fonction, la valeur du pointeur "lu" a été modifiée, et pas seulement la valeur des données sur lesquelles il pointe ! Ça me paraît absolument aberrant car il me semble qu'il aurait fallu un pointeur sur pointeur pour pouvoir modifier cette valeur.
Est-ce que vous auriez une idée de l'origine du problème ? Merci beaucoup d'avance,
Tanynep
P.S. : voici le code complet de ma fonction :
void fgets_perso(char* lu, int n_max, FILE* f)
{
char c[1]; //chaîne à un seul caractère pour utiliser la fonction strcat
int i = 0;
c[1] = '\0';
*lu = '\0'; //initialisation de la chaîne
*c = fgetc(f);
while((*c != EOF) && (*c != '\n') && (i < n_max)) //on s'arrête à la fin de la ligne ou du fichier ou quand le nombre max de caractères a été lu
{
strcat(lu, c);
i++;
*c = fgetc(f);
}
if((*c == '\n') && (i < n_max)) //si on est sorti à cause d'une fin de ligne, on ajoute le caractère '\n'
{
strcat(lu, "\n");
}
}
dans un petit programme en C, j'avais un problème avec la fonction fgets donc j'ai voulu la réécrire... mais là n'est pas la question. Le prototype de ma fonction est le suivant :
void fgets_perso(char* lu, int n_max, FILE* f);
lu est un pointeur sur la chaîne lue dans le fichier. Les seules opérations effectuées sur lu sont une initialisation à '\0' et une concaténation (strcat) avec les caractères lus un à un. Pourtant, quand je sors de ma fonction, la valeur du pointeur "lu" a été modifiée, et pas seulement la valeur des données sur lesquelles il pointe ! Ça me paraît absolument aberrant car il me semble qu'il aurait fallu un pointeur sur pointeur pour pouvoir modifier cette valeur.
Est-ce que vous auriez une idée de l'origine du problème ? Merci beaucoup d'avance,
Tanynep
P.S. : voici le code complet de ma fonction :
void fgets_perso(char* lu, int n_max, FILE* f)
{
char c[1]; //chaîne à un seul caractère pour utiliser la fonction strcat
int i = 0;
c[1] = '\0';
*lu = '\0'; //initialisation de la chaîne
*c = fgetc(f);
while((*c != EOF) && (*c != '\n') && (i < n_max)) //on s'arrête à la fin de la ligne ou du fichier ou quand le nombre max de caractères a été lu
{
strcat(lu, c);
i++;
*c = fgetc(f);
}
if((*c == '\n') && (i < n_max)) //si on est sorti à cause d'une fin de ligne, on ajoute le caractère '\n'
{
strcat(lu, "\n");
}
}
A voir également:
- [C] Modification indésirable d'un pointeur
- Suivi de modification word - Guide
- Liste numéro indésirable - Guide
- Logiciel gratuit modification pdf - Guide
- Courrier indésirable gmail - Accueil - Mail
- Pointeur souris - Guide
2 réponses
char c[1];
c[1] = '\0';
Après ces deux lignes, on est au moins sûr d'une chose; sans pourvoir prédire lequel, on est certain qu'il y aura un comportement anormal.
Tu dis que le tableau 'c' contient 1 caractère et tu écris un 'zéro' dans le deuxième ! Il te faut donc dire que le tableau contient 2 caractères dont l'indice utilisable pourra aller de '0' à '1'.
NB: Je n'ai pas lu tout ton code non indenté... il y a peut-être d'autres erreurs ;-)
Bonne continuation.
c[1] = '\0';
Après ces deux lignes, on est au moins sûr d'une chose; sans pourvoir prédire lequel, on est certain qu'il y aura un comportement anormal.
Tu dis que le tableau 'c' contient 1 caractère et tu écris un 'zéro' dans le deuxième ! Il te faut donc dire que le tableau contient 2 caractères dont l'indice utilisable pourra aller de '0' à '1'.
NB: Je n'ai pas lu tout ton code non indenté... il y a peut-être d'autres erreurs ;-)
Bonne continuation.