у меня есть команда sprintf, которая падает из-за% s в переменной aurgument. Какое исправление предлагается для этого, кроме экранирования строки aurgument с %%.
char* s="abc%sabc";
char a[100];
sprintf(a,"The message is : %s",s);
Любая помощь будет оценена.
Не использовать printf
напечатать произвольную строку. Либо использовать puts
или отформатируйте строку:
char const *evil;
// Bad:
printf(evil);
// Good:
puts(evil);
fputs(evil, stdout);
// Acceptable:
printf("%s", evil);
Обратите внимание, что «плохая» версия не просто теоретически плоха в некотором смысле, как компьютерная наука, но она фактически сразу же может использоваться для выполнения произвольного кода и эксфильтрации данных, благодаря %n
как обработка формата.
Ваш пример работает для меня: 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"
Я хотел бы остаться только в домене 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()
,
использование 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
Надеюсь, это поможет.
ОП, скорее всего, использует 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);