所以到目前为止我已经尝试过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而不是完整路径。
谢谢!
答案 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