C系统无法运行hello world

时间:2013-11-06 20:42:46

标签: c shell process

任何人都可以告诉我为什么这个简单的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:你好:没找到

  

3 个答案:

答案 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: - )