0

プロセスとそれに続くパイプラインコマンドで構成される文字列を受け取るプログラムを実装しようとしています。コマンドの文字列を{個々のコマンド/任意の数の引数配列}に分割するにはどうすればよいですか?「|」異なるコマンドを区切る文字です。

たとえば、次のように入力すると、pipe ls -lt | 猫レボウスキー| CD .. 。

異なるパイプで表される3つの別々のコマンドライン引数がここにあることをシステムに認識させるにはどうすればよいですか?

4

4 に答える 4

2

まず、パイプは特別なシンボルであるため、プログラムに渡すときにエスケープする必要があります。

pipe ls -lt \| cat Lebowski \| cd .. .

あなたの主な機能で:

main(int argc, char *argv[]) {

argvは、これらすべての引数 (ls、-lt、|、cat...) が異なるインデックスで含まれています。たとえば、argv[0]is lsargv[2]is'|'です。argcそのような引数の総数です。

于 2013-03-18T21:08:37.897 に答える
1

strtok_r()関数はあなたの友達です:

char **explode(char *s, const char *sep, size_t *outsz)
{
    size_t allocsz = 4;
    size_t sz = 0;
    char **arr = malloc(allocsz * sizeof(*arr));
    if (arr == NULL) {
        *outsz = 0;
        return NULL;
    }

    char *p, *end;
    for (p = srtok_r(s, sep, &end); p; p = strtok_r(NULL, sep, &end)) {
        if (++sz > allocsz) {
            allocsz <<= 1;
            arr = realloc(arr, sizeof(*arr) * allocsz));
            assert(arr != NULL); // sorry
        }
        arr[sz - 1] = strdup(p);
    }

    *outsz = sz;
    return arr;
}

使用法:

int main()
{
    char sentence[] = "The quick brown fox jumped over the lazy dog.";
    size_t sz;
    char **arr = explode(sentence, " ", &sz);
    int i;
    for (i = 0; i < sz; i++) {
        printf("%s\n", arr[i]);
        free(arr[i]);
    }
    free(arr);
    return 0;
}
于 2013-03-18T21:14:03.877 に答える
1

これを自分でやりたい場合、perrealの答えは非常に良いです。getopt()この目的にも使用できる関数があり、ここに文書化されていますgetopt()

于 2013-03-18T21:11:59.810 に答える
0

以来| は最も一般的なシェルの特殊文字であるため、引用する必要があります(他の人が述べているように)。次のような二重引用符で囲まれたすべての引数を引用する場合

パイプ"ls-lt | cat Lebowski | cd.."

argv[1]で解析できますstrtok_r()

于 2013-03-18T21:15:58.730 に答える