Demande d' aide sur les pointeurs - C++ - Programmation
Marsh Posté le 06-02-2006 à 19:19:13
char* destination ne pointe sur rien de valide, il y a un comportement indéfini.
Sinon, CopieChaine est pour le moins curieuse ...
Ajoutons à cela le double combo de la part du prof apparemment ( gets, fflush(stdin) ), et de plus en plus fort __fpurge(stdin), et j'en oublie ...
Poste dans la cat C, ça va les dérider un peu
Marsh Posté le 06-02-2006 à 19:36:25
quantic_blade a écrit : Salut à tous et à toutes, |
putain, un prof pareil, je l'enverrais bien en Afghanistan avec une pancarte à l'effigie de Mahomet en turban en forme de bombe
Marsh Posté le 06-02-2006 à 20:00:13
La partie en rouge c'est la seule partie qui m'a l'air correcte, c'est normal ?
C'est identique à ça en fait :
Code :
|
Marsh Posté le 06-02-2006 à 20:15:46
En fait la partie main(), je l'ai code à l'arrache parce qu'a la base j'utilise scanf que j'ai remplace mais j'ai pas corrige tout le code, non en fait c'est où est l'erreur dans CopieChaine parce que le prof prétend que
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
}
if(*psrc == '\0')
pdest[*psrc] = '\0';
est un illogisme totale
Marsh Posté le 06-02-2006 à 20:19:58
sinon faudrait apprendre à ton prof l'existence de strcpy() aussi
edit:
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
c'est le prof qui appelle ça "ensemble vide" ?
Marsh Posté le 06-02-2006 à 20:34:13
Pour le refus d'utiliser strcpy, je suppose que c'est pour apprendre à utiliser les chaînes de caractères.
Sinon c'est très mal écris mais ce nest pas faux donc comment tu veux que l'on te dise où est l'erreur ?
Plus sérieusement, compare avec ce que j'ai tapé pour voir où ce que tu fais a l'air étrange.
Marsh Posté le 06-02-2006 à 20:47:45
quantic_blade a écrit : En fait la partie main(), je l'ai code à l'arrache parce qu'a la base j'utilise scanf que j'ai remplace mais j'ai pas corrige tout le code, non en fait c'est où est l'erreur dans CopieChaine parce que le prof prétend que
|
le déréférencement aux lignes 5 et 6 est inutile, le test final est inutile, et l'instruction à mettre est : *pdest = 0;
Ce code s'écrit habituellement en une ligne, avec le prototype suivant :
void CopieChaine( char* dest, char const* src )
{
while( *dest++ = *src++ );
}
voire en C99 :
void CopieChaine( char* restrict dest, char const* restrict src )
{
while( *dest++ = *src++ );
}
Marsh Posté le 06-02-2006 à 20:53:03
et aussi
Code :
|
pratique pour condenser du code, un bon paquet des fonctions de string.h retournent l'adresse de la chaine modifiée
Marsh Posté le 06-02-2006 à 21:09:51
Merci, donc en fait j'avais bon , mais c'etait tres mal codé.
Ce qui est triste dans l'histoire, tu vois c'est que je fais de la prog depuis 1998 et que je commence à coder avec DX9 et DX10.
Alors je connais pas mal de truc sur les pointeurs et tout le toutim, mais le prof s'explique tellement bien ,qu'en fait je ne comprends plus rien de ce que je fait. Enfin de toute façon après le BTS j'aurais tout le loisir de me repencher sur les points que j'ai admit sans jamais cherché à les comprendre...
Enfin le coup du
void CopieChaine(char* pdest, char* psrc)
{
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
}
if(*psrc == '\0')
pdest[*psrc] = '\0';
}
en
void CopieChaine(char* pdest, char* psrc)
{
while(*psrc) // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
psrc++; // On incremente psrc
pdest++; // On incremente pdest
}
if(*psrc == 0)
*pdest = 0;
}
Que le prof ne l'ai pas vu est inacceptable parce qu'un prof linuxien qui dit savoir codé et qui ne voit pas ça, on finirait par se demander s'il vaut vraiment le coup d'être prof
Marsh Posté le 06-02-2006 à 21:25:09
Tu peux aussi, (comme il t'a déjà été dit) virer le
if (*psrc == 0)
le test est forcement vrai car pour sortir de la boucle while il faut que *psrc soit égal à 0.
Marsh Posté le 07-02-2006 à 12:49:44
bah oui, *pointeur++ = (*pointeur)++ et pas *(pointeur++)
or, pour parcourir la chaine, ca doit "un peu" mieux marcher si on modifie l'indice/l'adresse à laquelle on accède
le dernier test ne sert en effet à rien: si c'est '\0' tu testes la fin de chaine, or on y est deja. si c'est 0, ca doit être une erreur, car je vois pas trop quel sens ça aurait
donc tu mets directement *pdest = '\0'
en revanche, tu peux résoudre facilement ce truc-là en l'incluant dans la boucle si tu passes par un do while() au lieun d'un while()
Marsh Posté le 07-02-2006 à 13:00:14
ReplyMarsh Posté le 07-02-2006 à 13:37:24
ReplyMarsh Posté le 21-02-2006 à 16:37:01
Bonjour,
une simple remarque au sujet de ton programme, la variable "char *destination;" est un pointeur sur une zone de memoire
de type "char" donc si tu copie ta chaine source vers ta chaine destination sans avoir allouer de la memoire avec une
fonction du type malloc or calloc tu vas ecraser tout les donnees et le code de ton programme au moment de l'execution
de ta fonction de copie!
Apres avoir alloue la memoire pour ta chaine de destination il faut utiliser une founction de type memset pour initialiser
la zone a 0x00 ce qui evite de gerer le caracter de fin de chaine '\0' dans la fonction de copie.
A+
chrisbk a écrit : de toute facon c'est naze comme style d'ecriture |
Marsh Posté le 06-02-2006 à 18:51:27
Salut à tous et à toutes,
Je ne sais pas comment j'aurais du nommer le topique mais en fait pouvez vous me dire où est l'abbhération informatique là dedans :
#include <stdio.h>
void CopieChaine(char * pdest, char * psrc)
{
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
// un ensemble vide
{
*pdest = *psrc; // On met la valeur de psrc dans pdest
*psrc++; // On incremente psrc
*pdest++; // On incremente pdest
}
if(*psrc == '\0')
pdest[*psrc] = '\0';
}
int main()
{
char source[512]/*="Un beau dimanche"*/;
char *destination;
char indic='o';
do
{
// on rentre la chaine
__fpurge(stdin);
printf("Veuillez rentrer une chaine de caractere :\n" );
gets(source);
printf("%s\n", source);
CopieChaine(destination, source);
// on affiche la source et la destination
printf("Chaine source = %s", source);
printf("\nChaine destination = %s\n", destination);
__fpurge(stdin);
// on quitte ?
fflush(stdin);
printf("'q' pour quitter\n" );
scanf("%c", &indic);
}while(indic != 'q');
return 0;
}
Mon prof prétend que ce qui est écrit en rouge ne devrait théoriquement pas marché, car il nous a dit que *chose renvoie en fait une adresse donc dans cet exemple eh ben , je devrais l'avoir dans l'os, mais si vous compilez ce programme, miracle, il marche à merveille...
Pouvez vous m'expliquer en détail ces quelques lignes. Merci...