从c中的system()调用时找不到gcc

时间:2014-05-01 22:31:20

标签: c file gcc system sh

所以到目前为止我已经尝试过2个场景,但只有其中一个可以使用,但有效的场景并不是我想要使用的场景。

在我的c程序中,我可以拨打以下电话:

system("gcc filename.c");

这很好,但这意味着我必须硬编码文件的名称......但我想要做的是让用户输入文件名,然后从给定的输入编译它。以下是我的意见:

    char fileName[50];

    puts("Please enter the path to the file and name [including the .c extension (Example: /root/CS250/labs/lab9.c)]:");
    printf("\t? "); //Formating purposes
    scanf("%s", fileName); //Read in the file name [contains no spaces]

    printf("Compling file: %s with gcc command: ", fileName);

    //Building the command
    char command[75]; //random length of 75
    strcat(command, "gcc ");
    strcat(command, fileName);
    printf("%s\n", command);
    printf("Return from system call: %d\n", system(command));

当我运行此代码时,我输入的是我从输出中获得的内容:

? 2
Please enter the path to the file and name [including the .c extension (Example: /root/CS250/labs/lab9.c)]:
    ? ~/CS2/labs/lab8.c #COMMENT: This is the correct path to the file
    Compling file: ~/CS2/labs/lab8.c with gcc command: gcc ~/CS2/labs/lab8.c
    **sh: 1: gcc: not found //The error**
    Return from system call: 32512 //Exit code...

这里有什么问题?我不能用包含命令的char []调用系统吗?我该如何解决这个问题? [文件的路径是正确的,gcc如上所述工作正常,我可以运行系统(" gcc blah.c");它会正确编译;我也试过打电话:/ usr / bin / gcc。

另一个注意事项:如果有人可以告诉我如何绕过文件的完整路径那将是很棒的!我的意思是什么?现在你必须输入/root/folder/x.txt但程序存储在/ root / folder /中,所以我只想输入x.txt而不是完整路径。

谢谢!

1 个答案:

答案 0 :(得分:0)

x+10

是一个非常坏主意,因为您实际上并不知道char command[75]; //random length of 75 strcat(command, "gcc "); 中您追加的内容" gcc" 。它可能有一个单字符不可打印的控制字符,它仍然看起来有效,但不会被发现为可执行文件。

检查此方法的一种方法是在command之后执行printf("%x\n",*command),以检查第一个字符实际是否 strcat(0x67)。但是,无论如何,你所做的是不安全的 - 首先g几乎肯定是strcat所以你有一个已知的起点(a)

(a)如果你真的在所有地方都在使用strcpy,那我就不知道为什么你需要了要做到这一点),你至少应该在开始之前使缓冲区为空字符串:

strcat