Как использовать *** sprintf_s *** для linux C ++ - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь создать проект Linux C ++, используя тот же заголовок и файлы .cpp из проекта Windows C ++, используя Visual Studio. Я использую sprintf_s для преобразования строки в массив.

Но когда я переношу тот же код на Linux, sprintf_s показывает ошибку. Есть ли другие замены для sprintf_s?

Можно ли использовать snprintf вместо sprintf_s?

#if _WINDLL
        sprintf_s(DestinationArray, SourceString.c_str()); //Syntax using sprintf_s for Windows
#else

        snprintf(DestinationArray, SourceString.length(), SourceString.c_str()); //syntax using snprintf For Linux

#endif

Правильный ли приведенный выше синтаксис? Я новичок в C ++. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Есть ли другие замены для sprintf_s?

Есть std::snprintf. Более того, вы можете использовать std::string и iostreams.

Можно ли использовать snprintf вместо sprintf_s?

std::snprintf - замена для sprintf_s , Однако, передача размера исходной строки в качестве второго аргумента неверна. Вместо этого вы должны передать размер буфера назначения.

Кроме того, вы в первую очередь неправильно используете sprintf_s. Вы никогда не должны использовать строку нестандартного формата. Похоже, вы пытаетесь просто скопировать строку. Для этого существует, например, strlcpy (не является стандартным в C ++, но существует в BSD и Linux).

0 голосов
/ 28 января 2020

sprintf_s передает размер DestinationArray, а не SourceString. Кроме того, не передавайте произвольные строки как форматную строку, вот как вы получаете эксплойты форматной строки.

Более правильная формулировка:

#if _WINDLL
        sprintf_s(DestinationArray, "%s", SourceString.c_str()); //Syntax using sprintf_s for Windows
#else
        snprintf(DestinationArray, sizeof(DestinationArray), "%s",  SourceString.c_str()); //syntax using snprintf For Linux
#endif

Или вы можете определить sprintf_s для Linux как макрос:

#define sprintf_s(buf, ...) snprintf((buf), sizeof(buf), __VA_ARGS__)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...