2009-11-16 4 views
0
#include <stdio.h> 
#include <string.h> 
#include <conio.h> 
#include <iostream> 

using namespace std; 


char a[21]; // If this is put inside the function unter -> junk output 
char* b=""; 

void unter() 
    { 
     char *new_str = ""; 


     strcpy(a, new_str); 

     char str_temp[10]=""; 
     int chnum =0, neighbor1=3, neighbor2=5, mynode=4; 

     sprintf(str_temp,"%d",chnum); 

     b = strcat(a, str_temp); 
     b = strcat(b, "_from"); 
     sprintf(str_temp,"%d",mynode); 
     b = strcat(b, str_temp); 
     b = strcat(b, "to"); 
     sprintf(str_temp,"%d",neighbor1); 
     b = strcat(b, str_temp); 


    } 

int main() 
{ 
    unter(); 
    cout << a; 
    cout << b; 
    std::cin.get(); 
} 

Ceci est mon code en C++. Je ne suis pas sûr que le tableau de caractères 'a' ait aussi les mêmes valeurs que 'b'. Et d'ailleurs, je reçois une valeur indésirable pour « b » (en sortie) quand je déclare « un »Requête de concaténation de chaîne C++

char a[21]; 

dans la fonction unter(). Vous voulez expliquer comment?

+4

Juste parce qu'il faut dire: Même si je pense qu'il est clair que vous faites cela pour des raisons autres que le code de production, il suffit de garder à l'esprit tout cela est enveloppé dans 'std :: string'. – GManNickG

Répondre

3

a est un tableau char et b est un pointeur qui pointe vers a, donc lors de l'impression, ils impriment toujours la même chose. Lorsque vous déplacez la déclaration pour a dans unter, il est détruit lorsque unter renvoie, laissant b un pointeur dnagling, de sorte que vous obtenez des déchets lorsque vous l'imprimez.

+0

Cela a du sens. Merci – halluc1nati0n

3
b = strcat(a, str_temp); 

est probablement ce qui cause votre problème, puisque la valeur de retour de strcat() est le premier paramètre qui a été passé, d'où la raison pour laquelle vous voyez a et b devenir égaux, puisque b se prépare à dans cet appel.

1

En plus des autres conseils fournis, vous devez prendre connaissance de la ligne

b = strcat(b, str_temp); 

qui semble assez inapproprié pour b est simplement définie comme un pointeur char à un stockage à un octet (« » définit un vide chaîne, c'est-à-dire un tableau de caractères avec un seul élément contenant '\ 0')

Lorsque strcat s'ajoute à b, il crée un débordement de tampon.

Modifier: En fait, je viens de remarquer que b a été affecté au point à un, (grâce à la ligne précédant celle mentionné) de sorte que serait alors ok, puisqu'une peut avoir la place pour cela ... Il n'a pas de sens cependant, d'avoir besoin des deux variables. Peut-être que ce que vous ne comprenez pas, c'est que bien que strcat() renvoie un pointeur, ce retour n'a pas besoin d'être "consommé", c'est simplement un avantage, car quand on enchaîne des commandes par exemple. En d'autres termes, vous pouvez simplement écrire:

strcat(a, str_temp); 

Aucun char * b.

+0

hmm. En fin de journée, j'obtiens la sortie désirée et je suppose que je vais bien? – halluc1nati0n

1

Lorsque vous définissez a à l'intérieur de la fonction, la mémoire de la variable a est allouée sur la pile. Cette mémoire est détruite lorsque la fonction se termine. Votre pointeur b pointe vers l'adresse de début de a. Maintenant, si vous essayez d'accéder à b en dehors de la fonction, il pointe vers un emplacement de mémoire qui est déjà détruit et contient des valeurs parasites. Fondamentalement, b devient un pointeur qui pend.

1

Si vous déclarez a à l'intérieur de la fonction unter(), il est uniquement limité à cette fonction. Tenter d'imprimer b à partir de l'extérieur de la fonction imprimera indésirable car il pointe vers a qui est déjà détruit.

Ceci est un exemple classique de la raison pour laquelle vous devez toujours vous assurer de ne pas pointer vers une variable locale à partir d'une variable globale.

2

strcat() renvoie le résultat de l'opération de concaténation, de sorte

b = strcat(a, str_temp); 

résultat en b pointant vers le réseau a []. Les opérations suivantes strcat() font effectivement la même chose, de sorte que le résultat final est que b pointe sur un [] comme vous observez. Si vous déclarez un [] à l'intérieur de unter(), il aura une portée locale pour cette fonction, avec pour résultat que la variable globale b pointera vers un contenu de mémoire aléatoire/indéfini après avoir quitté l'appel à unter().

Il est légèrement intéressant de noter que vous faites beaucoup de travail qui pourrait être accompli plus facilement avec

sprintf(a, "%d_from%dto%d", chnum, mynode, neighbor1); 
2

Vous pouvez faire la concaténation ensemble et années sprintf en une seule ligne.

char* b=""; 
void unter() 
    { 
     int chnum =0, neighbor1=3, neighbor2=5, mynode=4; 
     char str_temp[21]; 
     sprintf(str_temp,"%d_from%dto%d", chnum, mynode, neighbor1); 
     b = new char[strlen(str_temp)+1]; 
     b = strcpy(b, str_temp); 
    } 

La seule chose drôle est que vous devez vous rappeler de supprimer b lorsque vous avez terminé. L'autre option utilise le tampon et sprintf directement à lui:

char a[21]; 
void unter() 
    { 
     int chnum =0, neighbor1=3, neighbor2=5, mynode=4; 
     char str_temp[21]; 
     sprintf(a,"%d_from%dto%d", chnum, mynode, neighbor1); 
    }