Ошибка сегментации (ядро выгружено) ошибка с 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 ответа

Решение

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;
}

system не возвращается char * но int, Используя его возвращаемое значение в качестве строки - char * - Скорее всего, даст вам Segfault.

int system (команда const char *);

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ Возвращаемое значение равно -1 при ошибке (например, ошибка fork (2)), а в противном случае возвращается статус команды. Последний статус возврата имеет формат, указанный в wait (2). Таким образом, код выхода команды будет WEXITSTATUS(статус). В случае, если / bin / sh не может быть выполнено, статусом выхода будет статус команды, которая завершает работу (127).

Другие вопросы по тегам