snprintf de unsigned long en ajoutant une virgule

J’essaie de convertir un unsigned long en une chaîne de caractères, en ajoutant une virgule à la fin du mot. Lorsque vous comstackz et exécutez le code de test, vous trouverez ci-dessous le résultat suivant:

 "1234," "1234" "1234" 

Le code de test est:

 #include  #include  int main () { unsigned long c = 1234; char ch[50]; char ch1[50]; sprintf(ch, "%lu,", c); std::cout << "\"" << ch << "\"" << " \"" << c << "\"" << std::endl; snprintf(ch1, 5, "%s", ch); std::cout << "\"" << ch1 << "\"" << std::endl; return 1; } 

Autant que je sache, ch devrait être de longueur 5, 4 chiffres plus 1 pour la virgule.

Me manque-t-il un extra plus un pour le personnage de terminaison?

À votre santé!

La taille transmise à snprintf inclut le caractère nul snprintf . Bien qu’il ne soit pas imprimé, il prend toujours de l’espace dans la mémoire tampon.

Vous devriez plutôt passer strlen(ch) + 1 . Ou mieux encore, simplement sizeof(ch1) suffira puisque vous souhaitez gérer l’intégralité du résultat avant de remplir le tampon.

Assurez-vous également que le tampon de destination a toujours une taille suffisante, égale ou supérieure à la taille transmise à snprintf . Dans votre cas particulier, cela peut difficilement arriver, mais en général, gardez cela à l’esprit.

De la page de manuel Linux :

Les fonctions snprintf () et vsnprintf () écrivent au plus octets de taille (y compris l’octet nul final (‘\ 0’)) dans str.

Alors oui, vous devriez avoir une longueur de 6 pour obtenir la virgule également.

La manière C ++:

 #include  unsigned long int c = 1234; std::ssortingng s = "\"" + std::to_ssortingng(c) + ",\""; std::ssortingng t = '"' + std::to_ssortingng(c) + ',' + '"'; // alternative 

Comme vous l’avez écrit, vous manquez un espace supplémentaire pour le caractère de terminaison.

Les fonctions snprintf () et vsnprintf () écrivent au maximum des octets de taille (y compris l’octet nul final (‘\ 0’)) dans str.

Comme plusieurs personnes l’ont souligné, vous devez inclure suffisamment d’espace pour le terminateur nul.

Il vaut toujours la peine de vérifier que le résultat renvoyé par snprintf correspond également à ce que vous pensez.

Enfin, je vous recommande d’utiliser snprintf (tampon, sizeof (tampon), etc., etc.)

Vos moins susceptibles d’obtenir des résultats embarrassants si le deuxième paramètre s’avère être plus grand que l’espace réel que vous avez disponible.