1

谁能告诉我为什么这个systemshell 命令的简单 C 调用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;
}

输出:

回声你好

sh:1:你好:未找到

4

3 回答 3

6

这不会像您认为的那样做:

   system ( ( "echo %s\n", str ) );

逗号运算符仅返回第二个值 ,str"hello"。因此,您的程序不会尝试运行echo hello,而只是hello.

您将要使用sprintf将整个命令写入缓冲区,然后执行该命令。

于 2013-11-06T20:46:08.093 回答
3

该行:

system ( ( "echo %s\n", str ) );

尝试运行系统命令"hello",这自然不是有效的命令。

这是因为您使用的是comma-operator,它只采用最右边参数的值。在这种情况下,最右边的是str,它是一个指向 string 的指针"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调用将执行该命令。

(请注意,我将大小设置为100outstring的固定大小。如果您应该生成更多输出,这是不安全的,但这是为了演示目的而做的最简单的事情)sprintf

于 2013-11-06T20:45:23.617 回答
1

提示:

  • system()(或带有 a 的字符串文字%)不会像 % 那样进行替换printf
  • 双括号使逗号成为产生其右参数 ( str) 的逗号运算符,而不是两个参数。C 不是 Python :-)
于 2013-11-06T20:46:04.980 回答