【问题标题】:C System can't run hello worldC系统无法运行hello world
【发布时间】:2013-11-18 07:10:17
【问题描述】:

谁能告诉我为什么这个简单的 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;
}

输出:

回声你好

sh: 1: 你好:未找到

【问题讨论】:

  • 仅供参考,我确实尝试过“谷歌搜索问题”,但术语 CSystemnot foundsh 不返回我正在寻找的内容

标签: c shell process


【解决方案1】:

行:

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 应该生成比这更多的输出,这是不安全的,但这是用于演示目的的最简单的事情)

【讨论】:

  • 是的,很抱歉,printf 命令只是为了表明我输出的是echo hello 而不是derp derp ;-)
  • 我不明白,那我怎么告诉它执行hello world
  • 出于好奇,= {0}的目的是什么
  • 它将整个数组初始化为零。不是绝对必要的,因为sprintf 函数也会以 0 结束字符串。但安全是一种很好的做法。
【解决方案2】:

这并不像你认为的那样:

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

comma operator 只返回第二个值str,即"hello"。因此,您的程序不会尝试运行echo hello,而只会尝试运行hello

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

【讨论】:

    【解决方案3】:

    提示:

    • system()(或带有 % 的字符串文字)不会像 printf 那样进行 % 替换
    • 双括号使逗号成为产生正确参数 (str) 的逗号运算符,而不是两个参数。 C 不是 Python :-)

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多