プロセスとそれに続くパイプラインコマンドで構成される文字列を受け取るプログラムを実装しようとしています。コマンドの文字列を{個々のコマンド/任意の数の引数配列}に分割するにはどうすればよいですか?「|」異なるコマンドを区切る文字です。
たとえば、次のように入力すると、pipe ls -lt | 猫レボウスキー| CD .. 。
異なるパイプで表される3つの別々のコマンドライン引数がここにあることをシステムに認識させるにはどうすればよいですか?
プロセスとそれに続くパイプラインコマンドで構成される文字列を受け取るプログラムを実装しようとしています。コマンドの文字列を{個々のコマンド/任意の数の引数配列}に分割するにはどうすればよいですか?「|」異なるコマンドを区切る文字です。
たとえば、次のように入力すると、pipe ls -lt | 猫レボウスキー| CD .. 。
異なるパイプで表される3つの別々のコマンドライン引数がここにあることをシステムに認識させるにはどうすればよいですか?
まず、パイプは特別なシンボルであるため、プログラムに渡すときにエスケープする必要があります。
pipe ls -lt \| cat Lebowski \| cd .. .
あなたの主な機能で:
main(int argc, char *argv[]) {
にargv
は、これらすべての引数 (ls、-lt、|、cat...) が異なるインデックスで含まれています。たとえば、argv[0]
is ls
、argv[2]
is'|'
です。argc
そのような引数の総数です。
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;
}
これを自分でやりたい場合、perrealの答えは非常に良いです。getopt()
この目的にも使用できる関数があり、ここに文書化されていますgetopt()
以来| は最も一般的なシェルの特殊文字であるため、引用する必要があります(他の人が述べているように)。次のような二重引用符で囲まれたすべての引数を引用する場合
パイプ"ls-lt | cat Lebowski | cd.."
argv[1]
で解析できますstrtok_r()
。