获取用户输入,然后执行execvp

获取用户输入,然后执行execvp,c,unix,strtok,C,Unix,Strtok,因此,我有下面的C代码,它要求用户发出一个命令(在unix中有效),然后我必须获取字符串并将其拆分为一个数组,以便执行用户用execvp()发出的命令。它可以编译,但execvp似乎不起作用。在数组中分割用户输入的方式是否有问题?附言:有些包含不是必需的,但它不是最终的程序 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include

因此,我有下面的C代码,它要求用户发出一个命令(在unix中有效),然后我必须获取字符串并将其拆分为一个数组,以便执行用户用execvp()发出的命令。它可以编译,但execvp似乎不起作用。在数组中分割用户输入的方式是否有问题?附言:有些包含不是必需的,但它不是最终的程序

#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");
}

我在这里看到的第一个问题是

char *p = strtok(str," ");
当您试图读取不确定的值时
str
未初始化,无法保证存在使其成为字符串的空终止符。所以,您实际上是在调用

也就是说

  • 。改用
  • 对于数组变量,
    sizeof(str)
    不提供内容的大小,而是返回整个数组的大小。您可能希望使用
    strlen()
    获取字符串的长度,但请记住,
    strlen()
    不计算空终止符

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);
}
. 改用。
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);
}