C snprintf没有创建正确的命令

C snprintf没有创建正确的命令,c,linux,ubuntu,C,Linux,Ubuntu,当我使用gdb调试程序并键入print命令时,它会打印以下内容: $4 = "sudo asterisk -rx \"pjsip show aor 101\"\000\000b\006@\000\000\000\000\000p\004@\00 ... and so on 正常情况下,它应该只是创建一个字符的普通命令?如果我是对的。这会导致另一个问题,因为popen()无法创建正确的流 这是我的重要代码:因为命令是一个数组(而不是char*),当您告诉gdb打印命令时,它会打印整个内容,包括尾

当我使用gdb调试程序并键入print命令时,它会打印以下内容:

$4 = "sudo asterisk -rx \"pjsip show aor 101\"\000\000b\006@\000\000\000\000\000p\004@\00 ... and so on
正常情况下,它应该只是创建一个字符的普通命令?如果我是对的。这会导致另一个问题,因为popen()无法创建正确的流


这是我的重要代码:

因为
命令
是一个数组(而不是
char*
),当您告诉gdb打印命令时,它会打印整个内容,包括尾随NUL字符后缓冲区中的任何内容。所以当你看到:

$4 = "sudo asterisk -rx \"pjsip show aor 101\"\000\000b\006@\000\000\000\000\000p\004@\00 
                                              ^^^^ -- NUL character

它向您显示了snprintf放入缓冲区的内容,以及函数启动时堆栈内存中出现的任何随机内容,堆栈空间保留给
命令

程序不完整,无法复制。第
行定义为什么?一方面另外,请注意gdb显示的是内存转储。字符串以零字节(
\000
)结尾。
命令的诊断打印(即
printf([%s]\n',command);
)会告诉您传递给
popen()的内容。类似地,如果您打印了返回的缓冲区(
printf([%s]\n,buff);
),它会告诉您数据中是否存在
someth
。您没有从
fgets()
检查返回状态-您不知道它是否有任何数据,因此您不知道
buff
的内容是否可能相关。printf格式中添加的方括号有助于识别尾随空格、嵌入的换行符或回车符等。我通常使用它们。我看不到任何代码。