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