0

現在、入力を取得して文字列 (char*) 配列に格納するシェルをプログラミングしています。パイプラインなどの UNIX 操作を有効にするために、次のようなコマンドを記述できるようにしたいと考えています。

echo this | function more | function2

これを行うには、while ループでコマンドとその引数を収集し、引数配列のすべての内容を、コマンド ライン全体を保持する新しい 2 次元配列 (" " など) にコピーしようとしますls -f -a。これまでのところ、これは機能しますが|、コマンド ラインで|'\0'元の入力の終わり:

char* arguments[MAXARGS]; // holds argument components, e.g. "ls" or "-f"
char** arg_collection[MAXARGS][MAXARGS]; // supposed to hold command lines, e.g. "ls -f -a"
argc_current = 0; // iterator for the loop, counts arguments
col_iterator = 0; // iterator for amount of command lines
int sentinel = 1; // sentinel value for while loop
...

while(sentinel)
{
    arguments[argc_current] = (char*) malloc (sizeof(word)); // word is defined, just not listed on here - refers to the currently read command / argument
     strcpy(arguments[argc_current], word); // copy current word into arguments

    if(tokens[argc_current] == TOKEN_TERMINATOR || tokens[argc_curernt] == TOKEN_NULL)
    {
       sentinel = 0; // tokens holds information about the type of word, e.g. if it is '\0'
    }

    if(tokens[argc_current] == T_BAR) // if the word is "|"
    {
       for(i = 0; i < argc_current; i++)
       {
          strcpy(arg_collection[col_iterator][i], arguments[i]); // copy argument list into collection
       }

       col_iterator++; // increment command line counter
       argc_current = 0; // reset argument counter, restart the loop
    }

    else
    {
        arg_current++; // increment current argument counter
    }
}

evaluating arguments here..

最初のループは正常に機能します。たとえば、次のように入力すると

echo this | echo more |

arg_collection[0][0]とを満たすarg_collection[0][1]のでecho this、結果として " " が得られます。しかし、1 にインクリメントcol_iteratorした後、2 番目の「|」に気付いて strcpy を呼び出すと、セグメンテーション違反という形でレンガの壁にぶつかりました。なんで?

4

2 に答える 2

2

のようwordですchar*。だったら変えるべき

arguments[argc_current] = (char*) malloc (sizeof(word));

arguments[argc_current] = malloc(strlen(word)+1);

sizeof(word)ポインタ変数が指すデータのサイズではなく、ポインタ変数のサイズを示します。 strlenの文字数を教えてくれますword。はターミネーター+1に必要です。'\0'

于 2013-04-12T15:06:41.487 に答える