2

我正在尝试编写一个 shell,它的部分构造是从用户输入的字符串(缓冲区)执行代码。但是,当我尝试使用其他输入(ae.echo a)执行字符串时,它总是会搞砸并返回-1。我不知道为什么。以下是相关部分:

char * buffer = calloc(100, sizeof(char));
...
fgets(buffer, 100, stdin);
buffer[strlen(buffer) - 1] = 0; // necessary because of a newline inserted by fgets
...
cmd = strsep(&buffer, " ");
char * str = malloc(50 * sizeof(char));
strcat(str, "./");
strcat(str, cmd);
strcat(str, ".out");
...
i = execvp(str, (char * *) buffer);
4

3 回答 3

1

论据buffer是错误的。的第二个参数execvp是一个指针数组。使用此转换,您隐藏了编译器警告,但它不起作用。

于 2012-12-08T17:30:12.063 回答
1

我可以在这里看到几个潜在的问题。

首先,您正在分配空间malloc(意味着内容未初始化),但立即strcat用于写入它。除非(通过任何改变)第一个字符是 a '\0',否则会给你留下一个以垃圾开头的字符串,然后是你试图放在那里的数据。它还会(很容易)导致写入超出缓冲区的末尾,从而产生未定义的行为。

如果由我决定,我想我会使用sprintf而不是strcat. 至少您所展示的内容可以:sprintf(str, "./%43s.out", cmd);

于 2012-12-08T17:30:19.177 回答
0

两个问题:

  1. 您正在将未初始化的字符串传递给第一个 strcat。
  2. execvp 需要一个字符串数组,而不是带有空分隔字段的单个字符串。
于 2012-12-08T17:32:03.637 回答