0

最大 4 つの引数を処理するプログラムを介して UNIX コマンドを実行しようとしていますが、これによりセグ フォールトやその他のエラーが発生するのはなぜですか?

using namespace std;

int main() {

char buffer[255];
cin >> buffer;


char* firstPtr;
char* secondPtr;
char* thirdPtr;
char* fourthPtr;

firstPtr = strtok(buffer, " ");
secondPtr = strtok(NULL, " ");
thirdPtr = strtok(NULL, " ");
fourthPtr = strtok(NULL, " ");


execlp(firstPtr, secondPtr);


   return 0;
}
4

3 に答える 3

2

クラッシュは、bufferオーバーフローが原因です。

Also note that may returnstd::cin.getline(buffer, sizeof(buffer))の代わりに使用してみてください。必ずそれを処理してください。std::cin >> buffer
strtokNULL

于 2013-11-05T06:31:27.047 に答える
1

使うべきだと思います

char buffer[255];
cin.getline(buffer, 255);

そうしないと、2 番目、3 番目、4 番目のポインターが空になります。

于 2013-11-05T06:29:33.353 に答える
1

のマニュアル ページを確認するexeclpと、最初の引数 (メソッドの 2 番目のパラメーター、arg0パラメーター) が必須であり、可変引数パラメーターを介して関数に渡す可能性のある他のパラメーターに加えて、それについても言及されていることがわかります。というテキストで

引数のリストは、NULL ポインターで終了する必要があります。

最初の引数 (この場合は secondPtr) は、実行可能ファイルの名前にする必要があります。したがって、ここで NULL を渡すことで規則に違反しています (cin >>他の人が既に指摘しているため)。

しかし、さらに、最後に必要な引数が少なくとも 1 つ不足していますNULL

そのため、man ページの調査を強くお勧めします。

于 2013-11-05T06:38:01.057 に答える