Pointeur de char

Résolu
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010 - 26 août 2008 à 15:13
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010 - 26 août 2008 à 18:33
Salut tout le monde voici mon code :
#include <cstdlib>
#include

void rajout(char ip[15], char *cmd){
         int i, j;
         for(i=0;i<40;++i){
                           if(*(cmd+i)>='a' && *(cmd+i)<='z');  //si il y a deja une lettre de commande alor passer a la prochaine case
                           else{for(j=i+1;j<40;j++){  //mettre une case vide pour l'espace et rajouter l'ip.
                                                  *(cmd+j)=ip[j-i-1];
                                                  }
                                                  }
                                                  }
}

int main(int argc, char *argv[])
{
    int choix;
    char ip[15];
    char ping[40]="ping";
    printf("ping\n\nAction :\n1)ping\n\nVotre choix : ");
    choix=getchar();
    switch(choix){
                  case '1':
                       fflush(stdin);
                       gets(ip);
                       rajout(ip, &ping);
                       puts(ping);
                       system(ping);
                       break;
                       }
}
le probleme est que a la fin ping devrai etre égale à "ping xxx.xxx.xxx.xxx" or la ping reste égale a "ping" je pence que le probleme vient des pointeurs pouriez vous m'aider à le résoudre. D'avance merci.

7 réponses

theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
26 août 2008 à 16:42
Bon si on met de coté le fait que c'est pas super propre comme code je vais m'en servir de base et faire la correction de ce code.

Ton erreur vient du fait que ta chaine de base "ping" contient bien evidemment un caractère de fin de chaîne.
en mémoire ca donnerait ca (je mets pas le code caractére associé a chaque lettre ca sert a rien pour cette exemple  'p' 'i ' 'n' 'g' '\0' Et celui la tu ne l'as pas pris en compte dans ta fonction. Après avoir exécuté ta fonction tu obtiens un truc du genre :

'p' 'i ' 'n' 'g' '\0' 'x' 'x' 'x' . 'x' 'x' 'x' . 'x' 'x' 'x' . 'x' 'x' 'x'

Ton carcatère de fin de chaine est donc toujours présent et donc ta chaine de caractère passée à la fonction "system(...)" est lue en tant que "ping" alors que l'adresse IP est bien concaténée juste après !! ^^

je te file une modif de code pour ta fonction rajout , elle utilise les libs standards du C tu ferais bien d'en faire autant pour la suite

void rajout(char ip[15], char *cmd){
    // j'ai rajouté ton check pour vérifier que la longueur du tout ne faisait pas plus de 40 caracteres
    if( (strlen(cmd)+strlen(ip)+1) < 40)
    {
        // rajouter l'espace avant de concaténer la suite de la chaine de caracteres
        strcat(cmd, " ");
       // copier l'IP
        strcat(cmd,ip);
    }
}

Voilà ca devrait résoudre ton problème.

Et sinon si je devais corriger ta fonction je ferai ca : (mais bon je te conseille d'utiliser les fonctions de la lib C qui se chargent de réaliser ce genre d'opérations) :

void rajout(char ip[15], char *cmd){
         int i, j;
         for(i=0;i<40;++i)
        {
                          
if(*(cmd+i)>='a' && *(cmd+i)<='z'); 
                           else
                           {
                                  // on remplace le caractere de fin de chaine par le caractere d'espacement ' ' (de valeur 0x20)
                                 *(cmd+i) = ' ';
                                  for(j=i+1;j<40;j++)
                                 {  //mettre une case vide pour l'espace et rajouter l'ip.
                                                  *(cmd+j)=ip[j-i-1];
                                  }
                            }
       }
}

A plus.

Mess with the best, die like the rest
3
zaibacker Messages postés 97 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 24 janvier 2018
26 août 2008 à 16:39
Salut,

Una chaine de caractère doit toujours se finir par le caractère '\0', je n'en vois pas.

Bon après j'avouerai que je ne comprend pas  "rajout(ip, &ping);" , les 2 sont des pointeurs mais tu mets un & à ping.

Puis je veux pas commencer à t'embrouiller avec mes propres solutions mais avec un strcat, tu concatènerais mieux 2 chaines de caractères dans une seule et ça t'eviterais d'utiliser la fonction "rajout".

@+
0
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010
26 août 2008 à 17:02
j'ai mi ta premiere proposition theneoiceman mais il me renvoi toujour une erreur connot convert char(*)[40] to char * for argument 2 to void rajout(char*,char*)
0
theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
26 août 2008 à 17:23
J'avais oublié de reprendre ce qu'a précisé [auteur/ZAIBACKER/697179.aspx zaibacker] =) Comme il l'avait déjà précisé j'avais pas jugé utile de le remettre mais bon ^^ Tu as un & en trop lors de l'appel a ta fonction de rajout.

Change l'appel a ta fonction Rajout :
remplace "rajout(ip, &ping);" par "rajout(ip, ping);" et ca marchera comme sur des roulettes ( =)

A plus.

Mess with the best, die like the rest
0

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

Posez votre question
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010
26 août 2008 à 18:07
effectivement merci beacoup ca marche tres bien ! mais je ne comprend pas pourquoi on ne met pas &ping vu que normalement les pointeurs c'est *pointeur = &variable et pas *ponteur = variable non ?
0
theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
26 août 2008 à 18:29
ping est du type char[40], c'est a dire un char* de taille max de 40 caractères. "ping" est donc déjà un pointeur donc tu n'as pas besoin de rajouter le & juste avant son utilisation pour l'appel à la fonction "rajout" car elle prend un char* en paramètre.

Par contre si tu avais pris un char ** en deuxième paramètre de rajout, là tu aurais dû mettre un & devant "ping" lors de l'appel à rajout (pour passer en paramètre le pointeur de pointeur sur tableau de caractères).

C'est un peu dur à expliquer l'arithmétique des pointeurs mais j'espère avoir été clair :p

A plus ^^
0
hacker_mt Messages postés 35 Date d'inscription samedi 14 mai 2005 Statut Membre Dernière intervention 4 novembre 2010
26 août 2008 à 18:33
oui ta reponse me convient parfaitement merci encore de votre aide et a bonne prog !
0
Rejoignez-nous