2014-04-19 6 views
-1

Je suis en train d'utiliser snprintf dans un C++ module, en utilisant ce code:C++: conversion invalide de 'const char *' à 'size_t'?

snprintf(err, "%s%s", "Fatal Error! ", err); 

mais je me fais l'erreur de "conversion non valide de 'const char *' à« size_t", quand compiler mon programme, alors comment résoudre ce problème? Merci.

+2

Avez-vous lu la documentation de snprintf, en particulier les arguments? http://en.cppreference.com/w/cpp/io/c/fprintf –

+0

int snprintf (char * str, taille size_t, const char * format, ...); –

+1

Même si vous ajoutez la taille du tampon, vous ne pouvez pas utiliser 'err' comme paramètre à passer à' ... 'pour le formatage et comme tampon de sortie. –

Répondre

2

snprintf a le prototype suivant:

int snprintf(char *str, size_t size, const char *format, ...) 

Argument deux devrait être la taille maximale de votre char buffer (à savoir err), qui a ici votre chaîne de format. Il est utilisé comme un "plus sûr" sprintf, puisque la fonction n'écrira pas plus de size octets dans le tampon, d'où une certaine prévention des débordements. Dans ce cas, je suppose que vous voulez juste utiliser le standard sprintf, qui a le prototype suivant:

int sprintf(char *str, const char *format, ...); 
+0

ouais, vous avez raison, je confondais entre snprintf et sprintf, je dois utiliser sprintf à la place, merci, ça aide vraiment! – user3464495

+0

Pas de soucis! S'il vous plaît marquer comme une réponse si cela a aidé. Je prendrais à bord ce que dit Daniel Frey dans les commentaires post, vous ne pouvez pas écrire dans «err» et en lire en même temps. Pensez-y logiquement, il essaiera d'y écrire la chaîne "Fatal Error", puis en lira pour écrire le reste sans jamais abandonner le terminateur "NULL". Je ne sais pas vraiment ce qui se passerait, mais mon intuition serait que j'écrirais juste "Fatal Error!" un nombre infini de fois jusqu'à ce qu'il se sépare. – slugonamission

+0

Je comprends, d'accord. – user3464495

1

En C, cette fonction est déclarée comme suit chemin

int snprintf(char * restrict s, size_t n, const char * restrict format, ...); 

Comme vous le voyez le deuxième paramètre est de type size_t mais dans l'appel de la fonction utilisée le second paramètre est de type const char *

snprintf(err, "%s%s", "Fatal Error! ", err); 

Vous utilisez simplement la fonction de manière incorrecte.

Le deuxième paramètre spécifie le nombre de caractères que vous allez lire dans variavle s. Habituellement, n est défini sur la taille du tableau de caractères pointé par s.

+0

+1 pour le prototype C. Que la sortie soit 'char * restrict' signifie que c'est un comportement non défini d'utiliser' err' comme une entrée et comme l'un des arguments de longueur variable. –

+0

@David Hammen Vous avez raison. –

Questions connexes