获取用户输入然后执行 execvp
Take user input and then do execvp
所以我有以下 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
我在这里看到的第一个问题是
char *p = strtok(str," ");
因为您正在尝试读取不确定的值。 str
未初始化,无法保证那里存在 null-terminator,这使得它成为 字符串 。所以,你实际上是在调用 undefined behavior.
也就是说,
gets()
, it is dangerous as it lead to buffer overflow. use fgets()
代替。
- 对于一个数组变量,
sizeof(str)
不会给你内容的大小,它returns你是整个数组的大小。您可能想使用 strlen()
来获取 字符串的长度 ,但请记住,strlen()
不计算 null-terminator.
您在 str
有任何信息之前打电话给 strtok(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);
}
所以我有以下 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
我在这里看到的第一个问题是
char *p = strtok(str," ");
因为您正在尝试读取不确定的值。 str
未初始化,无法保证那里存在 null-terminator,这使得它成为 字符串 。所以,你实际上是在调用 undefined behavior.
也就是说,
gets()
, it is dangerous as it lead to buffer overflow. usefgets()
代替。- 对于一个数组变量,
sizeof(str)
不会给你内容的大小,它returns你是整个数组的大小。您可能想使用strlen()
来获取 字符串的长度 ,但请记住,strlen()
不计算 null-terminator.
您在 str
有任何信息之前打电话给 strtok(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);
}