2013-02-26 1 views
3

J'essaye de concaténer à char * rv avec le résultat d'un appel de fonction qui retournera un int. fib() renvoie un int. Le principal problème que je suis en cours d'exécution en est que la signature de strcat() » exige une const char * que sa deuxième arg:Le moyen le plus efficace d'utiliser strcat() avec une chaîne et int?

char * strcat (char * destination, const char * source); 

Voici un petit échantillon de mon code. fib() calcule le nième nombre de fibonacci - dans ce cas, le numéro 7 fibonacci.

char * rv; 
int num; 

rv = (char*)malloc(2048*sizeof(char)); 
num = 7; 

... 

strcat(rv, (const char *)itoa(fib(num), rv,10)); 

De toute évidence, cela est incorrect et ne sera pas compilé. Quelle est la façon la plus propre de le faire? Ai-je besoin d'un autre char * var pour stocker les résultats de itoa() en premier, au lieu d'utiliser rv?

Nous vous remercions de l'aide que vous pouvez fournir!

+0

hors sujet, mais je peux suggérer 'rv = malloc (2048 * sizeof * rv)'; lancer le résultat de malloc est inutile dans C, et le nom de fichier dupliqué dans l'argument est juste bitrot attendant de se produire lorsque vous changez de type plus tard. – jthill

Répondre

2

Vous devez soit un char intermédiaire tableau à imprimer le numéro avant strcat ment, ou vous pouvez sprintf directement le numéro à rv, mais pour que vous avez besoin d'un pointeur vers la fin,

char *rv = malloc(2048); 
char *rv_end = rv; 
... 
rv_end += sprintf(rv_end, "%d", fib(num)); 

et également mettre à jour le pointeur rv_end lors de l'ajout d'autres choses à la tampon.

(Merci à jthill pour l'amélioration en utilisant la valeur de retour de sprintf.)

+1

ou 'rv_end + = sprintf (rv_end,"% d ", fib (num));' – jthill

+0

Nous vous remercions de votre réponse. Disons que je voulais ensuite ajouter une chaîne littérale à rv après votre code. Pourrais-je simplement utiliser 'sprintf (rv_end,"% s "," Hello World ")'? Et puis mettre à jour 'rv_end + = strlen (rv_end);' à nouveau? – iaacp

+0

@iaacp Oui, mais il vaut mieux utiliser l'amélioration de jthill. –

2

Vous pouvez le faire

sprintf(dest,"%s %d",rv,num); 
3

Utilisez snprintf() pour construire un tampon contenant le int et concaténer ensuite à votre tampon rv. Ne pas tentative de concaténer le contenu existant de rv dans le même appel à snprintf():

snprintf(rv, 2048, "%s%d", rv, itoa(fib(num), rv,10))); 

que cela signifie tampons d'entrée et de sortie se chevauchent ce qui est un comportement non défini.

aussi:

Ainsi, l'appel malloc() serait:

rv = malloc(2048); 
if (rv) 
{ 
} 
1
char * strcat (char * destination, const char * source); 

Le « const » sur la source indique simplement le compilateur que la fonction strcat ne modifiera pas « source ». Sinon,

strcat(buffer, "hi"); 

ne serait pas autorisé.

Cela ne signifie pas que votre source doit être constante et qu'elle ne doit pas contenir le modificateur const.

strcat(rv, (char *)itoa(fib(num), rv,10)); 

(pas de "const") est parfaitement légal et ne devrait générer aucun avertissement de compilateur.

Le seul problème est que si vous ne connaissez pas la longueur de la source, vous vous exposez à un dépassement de tampon. Dans ce cas particulier, vous pouvez calculer la durée du retour d'itoa et dimensionner la destination en conséquence. Cependant, il est probablement plus sûr pour nous de contrôler la taille de snprintf.

Questions connexes