如何将print format string作为参数传递?
example.cpp:
#include <iostream>
int main(int ac, char* av[])
{
printf(av[1],"anything");
return 0;
}
尝试:
example.exe "print this\non newline"
输出是:
print this\non newline
我希望:
print this
on newline
答案 0 :(得分:7)
不,不要那样做!这是一个非常严重的漏洞。你永远不应该接受格式字符串作为输入。如果您想在看到“\ n”时打印换行符,则更好的方法是:
#include <iostream> #include <cstdlib> int main(int argc, char* argv[]) { if ( argc != 2 ){ std::cerr << "Exactly one parameter required!" << std::endl; return 1; } int idx = 0; const char* str = argv[1]; while ( str[idx] != '\0' ){ if ( (str[idx]=='\\') && (str[idx+1]=='n') ){ std::cout << std::endl; idx+=2; }else{ std::cout << str[idx]; idx++; } } return 0; }
或者,如果您在项目中包含Boost C ++库,则可以使用boost::replace_all
函数将“\\ n”的实例替换为“\ n”,如Pukku建议的那样。
答案 1 :(得分:2)
至少如果我理解正确,你的问题实际上是将“\ n”转义序列转换为换行符。这发生在编译时,所以如果(例如)在命令行输入“\ n”,它将打印为“\ n”而不是转换为换行符。
我写了一些code 年以前转换转义序列时你想要它完成。请不要将它作为printf的第一个参数传递给它。如果要打印用户输入的字符串,请使用fputs或“%s”转换格式:
int main(int argc, char **argv) {
if (argc > 1)
printf("%s", translate(argv[1]));
return 0;
}
答案 2 :(得分:1)
你不能这样做,因为\n
等由C编译器解析。在生成的代码中,写入实际的数值。
这意味着您的输入字符串必须实际包含要被视为新行的字符值13(或10或两者),因为C函数不知道如何处理这些特殊字符,因为C编译器为它们做了。
或者,您只需将字符串中的\\n
的每个实例替换为\n
,然后再将其发送到printf
。
答案 3 :(得分:1)
将用户参数直接传递给printf会导致称为“字符串格式攻击”的漏洞利用
答案 4 :(得分:0)
无法自动让字符串包含换行符。在使用参数之前,您必须自己进行某种字符串替换。
答案 5 :(得分:0)
只有编译器在字符串中找到序列时才会将\ n等转换为实际的ASCII字符。
如果你想要从某个地方获得一个字符串,你需要直接操作字符串并用CR / LF等替换字符串“\ n”等。
如果你这样做,不要忘记“\\”也会成为'\'。
请永远不要在C ++中使用char * buffers,有一个更好的std :: string类更安全,更优雅。
答案 6 :(得分:0)
我知道答案,但这个帖子是否有效? 顺便说一句
你可以试试 example.exe“在换行符上打印此$(echo -e”\ n“)。我尝试并执行了 问候, Shahid nx