C ++ printf:来自命令行参数的换行符(\ n)

时间:2010-03-24 15:09:14

标签: c++ string formatting newline printf

如何将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

7 个答案:

答案 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会导致称为“字符串格式攻击”的漏洞利用

请参阅WikipediaMuch more details

答案 4 :(得分:0)

无法自动让字符串包含换行符。在使用参数之前,您必须自己进行某种字符串替换。

答案 5 :(得分:0)

只有编译器在字符串中找到序列时才会将\ n等转换为实际的ASCII字符。

如果你想要从某个地方获得一个字符串,你需要直接操作字符串并用CR / LF等替换字符串“\ n”等。

如果你这样做,不要忘记“\\”也会成为'\'。

请永远不要在C ++中使用char * buffers,有一个更好的std :: string类更安全,更优雅。

答案 6 :(得分:0)

我知道答案,但这个帖子是否有效? 顺便说一句

你可以试试 example.exe“在换行符上打印此$(echo -e”\ n“)。

我尝试并执行了 问候, Shahid nx