2011-03-08 1 views

Répondre

1

Cela ne provoque pas un avertissement de gcc, même avec -Wall -Wextra -pedantic:

#include "stdio.h" 

int main (void) { 
    char xx[1000] = "hello"; 
    sprintf (xx, "xyzzy plugh %s", xx); 
    printf ("%s\n", xx); 
    return 0; 
} 

Cependant, la raison pour laquelle cela est considéré comme une mauvaise idée peut être vu de la sortie. Plutôt que d'obtenir:

xyzzy plugh hello 

comme une personne normale peut attendre, vous obtenez en fait:

xyzzy plugh xyzzy plugh 

mais, comme tout comportement non défini, votre kilométrage peut varier.

La référence définitive est la norme C99, section 7.19.6.6 The sprintf function, qui stipule que:

La fonction sprintf est équivalente à fprintf, sauf que la sortie est écrite dans un tableau (spécifié par l'argument s) plutôt que à un flux. Un caractère nul est écrit à la fin des caractères écrits; il n'est pas compté comme faisant partie de la valeur retournée. Si la copie a lieu entre des objets qui se chevauchent, le comportement n'est pas défini.

La norme C++ (bien, en fait le projet de C++ 0x , mais il est sûrement en raison d'un jour à, je l'espère - Vas-y les gars, faites-le sur là) références ce car il intègre des pièces de la norme C comme fonctionnalité obsolète.

+0

+1 pour la réponse. +2 pour être psychique. –

Questions connexes