0

コマンド ライン ユーティリティを作成していますが、コマンドと引数を保存する方法が見つかりません。これまでのところ、次のものがありますが、セグメンテーション違反が発生します:

int main(void)
{
    char *command;
    char *args[MAX_LINE/2 + 1]; 
    int should_run = 1;

    do{
         cout << "cmd> ";
         int counter = 0;
         while(cin >> command) {
             strcpy(args[counter],command);
             counter++;
         }
        cout << args[0] << "\n";
    }  
}
4

3 に答える 3

4

次の理由により、セグメンテーション違反が発生します。

cin >> command

初期化されていないメモリに書き込もうとします。これは C++ であるため、次のようにする必要があります。

std::string command;

それ以外の:

char * command;

についても同様ですargsargs[counter] = command次に、を使用する代わりに行うことができますstrcpy()。追加のポイントについてはstd::vector<std::string> args、配列を使用する代わりに実行し、args.push_back(command)代わりにargs[counter] = command.

例えば:

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::string command;
    std::vector<std::string> args;

    std::cout << "cmd> ";
    while( std::cin >> command ) {
        args.push_back(command);
    }

    int i = 0;
    for ( auto a : args ) {
        std::cout << "Arg " << i++ << " is " << a << std::endl;
    }

    return 0;
}

出力:

paul@local:~/src/cpp/scratch$ ./args
cmd> test this command
Arg 0 is test
Arg 1 is this
Arg 2 is command
paul@local:~/src/cpp/scratch$
于 2013-10-20T21:51:57.653 に答える
2

よくある誤解はchar *、C または C++ で特別な役割を果たすだろうというものです。これは主に、これが合法であることに動機付けられたものです。

char const * foo = "String";

実際、char *は依然として char への単なるポインタであるため、文字列リテラルを割り当てる前にメモリを割り当てる必要があります。コードでこの問題が 2 回発生します。

char * command;
std::cin >> command;

char * arr[N];
std::strcpy(arr[k], command);

C++ では、このためにstd::stringやなどのコンテナーを使用する必要がありますstd::vector<std::string>。char 配列を使用することを主張する場合は、静的な最大長を決定できます。

char command[MAX_LENGTH];
char args[N][MAX_LENGTH];

または動的に使用new[]

char * command = new char[MAX_LENGTH];
char * args[N];
for(unsigned k = 0; k < N; ++k) args[k] = new char[MAX_LENGTH];

ただし、そのメモリも解放することを忘れないでください。

delete[] command;
for(unsigned k = 0; k < N; ++k) delete[] args[k];

したがって、コンテナを使用しない正当な理由があるはずなので、そうしない正当な理由がない限り、自動保存期間を優先する必要があります。

于 2013-10-20T22:02:06.710 に答える
0

この文

while(cin >> command)

無効です。まず、変数コマンドが初期化されていませんでした。次に、ストリーム cin がそこにデータを配置できるようにメモリを割り当てる必要があります。文字配列 (静的または動的に割り当てられた) を使用するか、データの入力にクラス std::string を使用します。

于 2013-10-20T21:54:49.783 に答える