2

シェルを作成しようとしていますが、その構築の一部で、ユーザーが入力した文字列 (バッファー) からコードを実行しています。ただし、追加の入力 (e.echo a) を使用して文字列を execvp しようとすると、常にプーチがねじ込まれ、-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は間違っています。の 2 番目の引数execvpは、ポインターの配列です。このキャストを使用すると、コンパイラの警告が隠されますが、機能しません。

于 2012-12-08T17:30:12.063 に答える
1

ここで、潜在的な問題がいくつか見られます。

最初に、スペースを割り当てていますがmalloc(コンテンツが初期化されていないことを意味します)、すぐstrcatに書き込みに使用します。(何らかの変更によって)最初の文字が でない限り'\0'、ゴミで始まる文字列が残り、そこに入れようとしているデータが続きます。また、(非常に簡単に)バッファの末尾を超えて書き込みが行われ、未定義の動作が発生します。

sprintfそれが私次第だったら、代わりに を使うと思いますstrcat。少なくとも、あなたが示したものは次のように機能します:sprintf(str, "./%43s.out", cmd);

于 2012-12-08T17:30:19.177 に答える
0

2 つの問題:

  1. 初期化されていない文字列を最初の strcat に渡しています。
  2. execvp は、null で区切られたフィールドを持つ単一の文字列ではなく、文字列の配列を想定しています。
于 2012-12-08T17:32:03.637 に答える