Сбой sprintf из-за% s в переменной аргумента

у меня есть команда sprintf, которая падает из-за% s в переменной aurgument. Какое исправление предлагается для этого, кроме экранирования строки aurgument с %%.

char* s="abc%sabc";
char a[100];
sprintf(a,"The message is : %s",s);

Любая помощь будет оценена.

2

Решение

Не использовать printf напечатать произвольную строку. Либо использовать puts или отформатируйте строку:

char const *evil;

// Bad:
printf(evil);

// Good:
puts(evil);
fputs(evil, stdout);

// Acceptable:
printf("%s", evil);

Обратите внимание, что «плохая» версия не просто теоретически плоха в некотором смысле, как компьютерная наука, но она фактически сразу же может использоваться для выполнения произвольного кода и эксфильтрации данных, благодаря %nкак обработка формата.

2

Другие решения

Ваш пример работает для меня: http://ideone.com/ZnsiZZ.

Просто используйте std::string:

#include <string>  // for std::string

std::string s = "abc%sabc";
std::string a = "The message is : " + s;

Или, если вам нужно объединить другие типы, такие как интергеры:

#include <string>  // for std::string
#include <sstream> // for std::stringstream

std::string s = "abc%sabc";
int i = 42;
std::stringstream sstr( "The message is : " );
sstr << s << "" << i;
std::string a = sstr.str(); // a = "The message is : abc%abc 42"
2

Я хотел бы остаться только в домене C (не использовать C ++).

Для меня этот код не вылетает и печатает abc%abc:

#include <stdio.h>
int main() {
char* s="abc\%sabc";
printf("The message is: %s\n", s);
}

но этот код печатает abcabc (без%) и иногда вылетает:

#include <stdio.h>
int main() {
char* s="abc\%sabc";
char a[100];
sprintf(a, "The message is: %s\n", s);
printf(a);      // <-- %s is interpolated in printf!
}

Скорее всего, ваша проблема в том, что вы пытаетесь напечатать строку, созданную sprintf с помощью printf — это делает вторую интерполяцию и вызывает все неприятности.

Решение всегда использовать puts() печатать строки, которые были созданы sprintf(),

2

использование std::string и ваша проблема пойдет

#include <sstream> //include this

std::string s = "abc%sabc";
std::string a = "The message is : " + s;

Если вы хотите использовать не строковое значение, такое как int, затем std::stringstream поможет вам:

int s = 100; //s is int now!
std::stringstream ss("The message is : ");
ss << s;
std::string a = ss.str(); //a is => The message is : 100

Надеюсь, это поможет.

1

ОП, скорее всего, использует printf(a) напечатать произвольную строку a,

char* s="abc%sabc";
char a[100];
sprintf(a,"The message is : %s",s);
// My guess is that OP follows with
printf(a);  // This causes the error.

Это не удается, потому что a является "The message is : abc%sabc", Как формат за printf()функция ожидает другого аргумента из-за %s в a — что не дано и неопределенное поведение (UB) результаты.

Вместо ОП следует вместо

printf("%s", a);
// or
puts(a);
1
По вопросам рекламы [email protected]