Question

J'ai un programme C qui utilise sprintf_s. Il fonctionne très bien dans Windows, mais quand je compile mon code sous Linux donne cette erreur:

sprintf_s was not declared in this scope.

Pourquoi cela arrive et comment puis-je résoudre ce problème?

Était-ce utile?

La solution

Il est pas standard, vous ne trouverez pas cette fonction sur Linux.

Fonction standard snprintf doit avoir une sémantique similaire.

Autres conseils

sprintf_s ne fait pas partie de la bibliothèque standard C, il est donc pas portable, donc vous n'êtes pas en mesure de l'utiliser sous Linux. Mais vous avez snprintf, ce qui est très similaire et il devrait vous aider à accomplir ce que vous voulez.

sprintf_s ne fait pas partie de la bibliothèque standard C, et vous ne serez pas en mesure de l'utiliser sous Linux.

Cependant, snprintf est standard et devrait faire la même tâche.

sprintf_s est seulement une partie de l'annexe K, en option Annexe à la norme C11:

Annexe K

...

K.2 Portée

  1. La présente annexe spécifie une série de option extensions qui peuvent être utiles dans l'atténuation des les failles de sécurité dans les programmes, et de nouvelles fonctions, comprennent macros et types déclarée ou définie en-têtes standard existants.

...

Les K.3.5.3.6 sprintf_s fonctionnent

Synopsis

#define __STDC_WANT_LIB_EXT1__1
#include <stdio.h>
int sprintf_s(char * restrict s, rsize_t n,
const char * restrict format, ...);

(italique ajouté)

Il n'a jamais fait dans POSIX (ou Linux) (et pas manqué du tout, il y a même des arguments au sujet de son utilité au sein du comité).

Pour une meilleure portabilité, utilisez snprintf qui fait partie de la norme de base et fournit toutes les fonctionnalités dont vous aurez besoin.

snprintf est peu sûr, que sprintf_s est sécurisé. snprintf ne garantit pas d'ajouter une finale \ 0, ce qui conduit à des dépassements ultérieurs possibles. regarder https://github.com/rurban/safeclib pour une bonne mise en œuvre.

Lors d'un portage de mon programme de Windows à Linux, je l'ai écrit suivant la mise en œuvre dans mon propre windows.h:

inline int sprintf_s(char* buffer, size_t sizeOfBuffer, const char* format, ...)
{
    va_list ap;
    va_start(ap, format);
    int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
    va_end(ap);
    return result;
}

template<size_t sizeOfBuffer>
inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...)
{
    va_list ap;
    va_start(ap, format);
    int result = vsnprintf(buffer, sizeOfBuffer, format, ap);
    va_end(ap);
    return result;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top