-2

我在这段简短的代码中尝试解决这个运行时分段错误时遇到了麻烦。我怀疑这与在代码中使用 system() 和 strcpy() 有关,但由于我没有遇到此类错误,我不确定该怎么做,到目前为止我还没有找到很多有用的页面。

编码:

#include <stdio.h>
#include <string.h>
int main(){
        char command[31], string[128];
        strcpy(string, (char *)system("grep -Po '(?<=testString\\s)\\S+' File"));
        string[strlen(string)] = '\0';
        printf("%s", string);
        return 0;
}

我正在使用 GCC 4.7.3 来编译程序。我真的很感激这方面的任何帮助。

4

2 回答 2

2

system不返回char *但是int。使用它的返回值作为字符串 - char *- 很可能会给你段错误。

int 系统(常量字符 * 命令);

返回值 如果出错(例如 fork(2) 失败)返回的值为 -1,否则返回命令的状态。后一种返回状态采用 wait(2) 中指定的格式。因此,该命令的退出代码将是 WEXITSTATUS(status)。如果 /bin/sh 无法执行,退出状态将是执行 exit(127) 的命令的状态。

于 2013-09-04T11:13:10.687 回答
0

system命令在错误时返回 -1,否则返回命令的状态。

在这种情况下,类型转换integer return value是导致的。segmentation fault

要将命令的输出复制到缓冲区,我们可以使用popen它返回一个文件指针FILE *,您可以从中读取命令输出。

这是代码:

#include <stdio.h>
#include <stdlib.h>


int main( int argc, char *argv[] )
{

  FILE *fp;
  char string[128];


  /* Open the command for reading. */
  fp = popen("grep -Po '(?<=testString\\s)\\S+' File ", "r");

  if (fp == NULL) {
        printf("Failed to run command\n" );
        exit;
  }

  /* Read the output of command */
  while (fgets(string, sizeof(string)-1, fp) != NULL) {
        printf("%s", string);
  }

  /* Close */
  pclose(fp);

  return 0;
}
于 2013-09-04T11:50:12.607 回答