2010-02-19 5 views
0

J'utilise le code suivant pour copier le contenu de la chaîne dans une autre chaîne. Deux logiques sont utilisées, Une avec boucle while (commentée) fonctionne et l'autre n'est pas (as = at).Erreur dans le programme exemple strcpy

S'il vous plaît aidez-moi à identifier la faille dans ce code.

Merci à l'avance


#include<stdio.h> 
#include<conio.h> 
main() 
{ 
    char *s="SourceString"; 
    char *t="TargetString"; 

    void print(char *s); 
    void strcopy(char *s,const char *t); 
    print(s); 

    strcopy(s,t); 
    print(s); 
    getch(); 
} 

void strcopy(char *as,const char *at) 
{ 
    /*while((*as=*at)!='\0') // working 
    { 
     as++; 
     at++; 
    } */ 
    as=at; //not working 
} 

void print(char *s) 
{ 
    printf("\n Printing the Contents:"); 
    for(;*s!='\0';s++) 
     printf("%c",*s); 
    printf("\n END"); 
} 

Tous disent que les chaînes sont passés par valeur et non par adresse. Mais je passe l'adresse des chaînes en appelant functiona nd dans la fonction appelée am using des pointeurs. S'il vous plaît préciser que je suis nouveau à des pointeurs

Répondre

2

Lorsque as est un argument de fonction, l'écriture as=anything; cesse d'avoir effet lorsque la fonction se termine, parce que ses arguments cessent d'exister (ainsi que ses variables locales). Vous ne modifiez pas la chaîne, vous modifiez seulement une cellule mémoire qui contenait temporairement l'adresse de la chaîne, et qui allait être libérée de toute façon.

Votre question est vraiment une question sur les pointeurs. Peut-être que vous pouvez trouver une question déjà posée sur StackOverflow sur les pointeurs en C ou C++ qui vous aide.

1

La version qui fonctionne utilise une boucle pour copier un caractère à la fois.

La version qui ne copie pas simplement une variable de pointeur vers une autre. Cette opération n'affecte rien d'autre dans le programme. as = at modifie juste une variable locale et retourne. Donc, ce n'est pas une optimisation que vous pouvez faire.

0

Avec as=at;, vous copiez une variable locale dans une variable locale. Peu importe qu'ils soient des pointeurs - ce sont des copies sur la pile de la fonction, donc vos changements ne sont pas visibles en dehors de la fonction.

2

Attribution d'une chaîne comme ceci:

char *s="SourceString"; 

est d'utiliser la mémoire en lecture seule modifing de sorte que le contenu se traduira par un comportement non défini. L'utilisation de tableaux fonctionnera probablement comme vous le pensiez. Dans votre exemple, vous jouez simplement avec des variables locales qui sont détruites lorsque la fonction strcpy revient à zéro.

Vous pouvez essayer quelque chose comme ceci:

void strcopy2(char **s, char **t) //<--- pointers to pointers, ouch! 
{ 
    *t = *s; //<--- Assign the value of the pointer who's address was passed. 
} 

int main(void) 
{ 
    char *s = "SourceString"; 
    char *t = "TargetString"; 

    printf("%s\n", s); 
    strcopy2(&s, &t); //<--- pass address of pointers! 
    printf("%s\n", t); 

} 

Je préfère utiliser des tableaux ombles mais si je suis la manipulation des chaînes.

+0

Oh, bon point. Et double bon point pour remarquer que la chaîne "TargetString" était celle qui était lue et "SourceString" celle à laquelle elle était écrite. –

0

Voici deux erreurs avec votre code qui ne fonctionne pas.

1) Votre instruction as = at copie une variable locale sur un autre local. L'affectation est perdue une fois que vous quittez la fonction.
2) Vous traces de fuites probablement tout comme pointé avant la cession,

Un autre problème potentiel dans l'utilisation est que généralement en C nous disons cible < - la source afin que votre utilisation de comme et au regarde en arrière.

Questions connexes