所以我有以下C代码,要求用户给出一个命令(在unix中有效),然后我必须取出字符串并将其拆分为一个数组,以便执行用户给出的execvp命令()。它编译但execvp似乎不起作用。我在数组中拆分用户输入的方式有问题吗? PS:其中一些包含不是必要的,但它不是最终的计划。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
main() {
char str[64];
int i =0;
char *p = strtok(str," ");
printf("Please give me a Unix command! :\n");
gets(str);
char *array[sizeof(str)];
while (p!=NULL) {
array[i++] = p;
p = strtok (NULL, " ");
}
execvp(str ,array);
perror("execvp");
}
我运行时获得的输出是:
Please give me a Unix command! :
ls -l
execvp: No such file or directory
答案 0 :(得分:1)
在strtok(str, " ")
有任何信息之前,您正在致电str
。
输入后只需打电话:
main() {
char str[64];
char *array[sizeof(str)];
char *p = NULL;
int i = 0;
printf("Please give me a Unix command! :\n");
fgets(str, sizeof(str), stdin); // Use fgets instead of gets.
p = strtok(str," ");
while (p != NULL) {
array[i++] = p;
p = strtok(NULL, " ");
}
execvp(str, array);
}
答案 1 :(得分:0)
我在这里看到的第一个问题是
char *p = strtok(str," ");
因为您正在尝试阅读不确定的值。 str
未初始化,不保证存在空终止符,这使得它成为字符串。所以,你基本上是在调用undefined behavior。
那就是说,
gets()
, it is dangerous as it lead to buffer overflow。请改用fgets()
。sizeof(str)
没有给出内容的大小,它会返回整个数组的大小。您可能希望使用strlen()
来获取字符串的长度,但请记住,strlen()
不计算空终止符。