Domanda

Ho un programma C che utilizza sprintf_s. Funziona bene in Windows, ma quando compilo il mio codice in Linux dà questo errore:

sprintf_s was not declared in this scope.

Perché accade questo e come posso risolvere il problema?

È stato utile?

Soluzione

Non è normale, non troverete tale funzione su Linux.

funzione standard snprintf dovrebbe avere una semantica simile.

Altri suggerimenti

sprintf_s non fa parte della libreria standard C, quindi non è portatile, quindi non si è in grado di utilizzarlo in Linux. Ma tu hai snprintf, che è molto simile e dovrebbe aiutare a realizzare ciò che si desidera.

sprintf_s non fa parte della libreria standard C, e non sarà in grado di utilizzarlo in Linux.

Tuttavia, snprintf è standard e dovrebbe fare la stessa operazione.

sprintf_s è solo una parte dell'allegato K, un opzionale Allegato per lo standard C11:

Allegato K

...

K.2 Ambito

  1. Il presente allegato specifica una serie di opzionale le estensioni che possono essere utili nella mitigazione dei vulnerabilità di sicurezza nei programmi, e comprendono nuove funzioni, macro e tipi dichiarati o definiti in intestazioni standard esistenti.

...

K.3.5.3.6 funzione I sprintf_s

Sinossi

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

(enfasi aggiunta)

Non è mai fatto in POSIX (o Linux) (e non è mancato a tutti, ci sono anche argomenti su sua utilità nel comitato).

Per una migliore portabilità, utilizzare snprintf che fa parte dello standard core e fornisce tutte le funzionalità di cui ha bisogno.

snprintf è insicuro, sprintf_s solo è sicuro. snprintf non garantisce per aggiungere una finale \ 0, portando a possibili overflow successivi. guarda https://github.com/rurban/safeclib per una corretta applicazione.

Nel corso di un porting del mio programma da Windows a Linux, ho scritto a seguito dell'attuazione nel mio 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top