2017-02-16 54 views
-2

,它打印此:的snprintf不会创建正确的命令

$4 = "sudo asterisk -rx \"pjsip show aor 101\"\000\000b\[email protected]\000\000\000\000\000p\[email protected]\00 ... and so on 

Normaly它应该只是创建简单的命令作为一个char?如果我是对的。这会导致另一个问题,因为popen()不能创建合适的流。

这里是我的重要代码:

+2

程序不完整,无法重现。什么是行定义**为**?一件事。另外,请注意,gdb显示你有一个内存转储。 *字符串*结束于零字节('\ 000')。 – DevSolar

+0

'command'(也就是'printf(“[%s] \ n”,command)'')的诊断信息会告诉你什么传递给'popen()'。同样,如果您打印返回的缓冲区('printf(“[%s] \ n”,buff);'),它会告诉您数据中是否存在“someth”。你没有检查'fgets()'的返回状态 - 你不知道它是否有任何数据,所以你不知道'buff'的内容是否可能是相关的。添加到printf格式的方括号可帮助您识别尾随空格或嵌入的换行符或回车符等。我通常使用它们。 –

+2

我看不到任何代码。 – Gerhardh

回答

2

由于command是一个数组(不是char *)当你告诉gdb来print command,它打印的全部内容,包括结尾的NULL字符后,任何在缓冲区中。所以当你看到:

$4 = "sudo asterisk -rx \"pjsip show aor 101\"\000\000b\[email protected]\000\000\000\000\000p\[email protected]\00 
               ^^^^ -- NUL character 

它显示你的snprintf放在缓冲区,以及任何随机的东西正好是在栈上的内存中,当功能启动和堆栈空间留给了command