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