strcpy()的分段错误(核心转储)错误(疑似)

时间:2013-09-04 11:09:46

标签: c segmentation-fault strcpy

我在这段短代码中尝试运行时分段错误。我怀疑它与代码中使用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编译程序。我非常感谢你对此有任何帮助。

2 个答案:

答案 0 :(得分:2)

system不会返回char *,而是int。将其返回值用作字符串 - char * - 很可能会为您提供段错误。

  

int system(const char * command);

     

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

答案 1 :(得分: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;
}