任何人都可以告诉我为什么这个简单的C system
调用shell hello world
命令无效:
MWE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main( int argc, char *argv[] )
{
char *str;
str = strdup ( "hello" );
printf ( "echo %s\n", str );
system ( ( "echo %s\n", str ) );
return 0;
}
输出:
echo hello
sh:1:你好:没找到
答案 0 :(得分:6)
这不符合你的想法:
system ( ( "echo %s\n", str ) );
comma operator只返回第二个值str
,即"hello"
。因此,您的计划不会尝试echo hello
而只是hello
。
您需要使用sprintf
将整个命令写入缓冲区,然后执行该命令。
答案 1 :(得分:3)
该行:
system ( ( "echo %s\n", str ) );
尝试运行系统命令"hello"
,这当然不是有效的命令。
这是因为您使用的是comma-operator,它只接受最右侧参数的值。在这种情况下,最右边是str
,它是指向字符串"hello"
的指针。
(左侧参数,"echo %s\n"
在调用system
时忽略
假设你打算打电话:
system("echo hello");
您需要执行以下操作:
char *str;
char outstring[100] = {0};
str = strdup ( "hello" );
sprintf (outstring, "echo %s\n", str);
system (outstring);
sprintf
行将构建字符串"echo hello\n"
,并将其放入outstring
。
然后system
调用将执行该命令。
(请注意,我将outstring
的大小设置为固定大小 100 。如果您的sprintf
生成的输出数量超过此值,则不安全,但这是为演示目的而做的最简单的事情)
答案 2 :(得分:1)
提示:
system()
(或带有%
的字符串文字)不会像printf
str
),而不是两个参数。 C不是Python: - )