2013-05-21 2 views
0

Я делаю оболочку (в C) для школьного задания, и у меня есть эта проблема: я прочитал вход и имею массив слов. (например: {"/ bin/ls", "-l", ">", "file"}) И я хочу иметь подмассивы со всеми словами между специальными символами типа '<', '>', '|' , Так что, если мой входC Сплит массив строк в подмассивах

/bin/ls -l > f.txt > /usr/bin/wc 

Я хочу иметь:

{{"bin/ls", "-l"}, {"f.txt"}, {"usr/bin/wc"}} 

Так что я могу легко назвать execv с правильными аргументами.

В настоящее время у меня есть char ***, который я вряд ли выделяю с помощью трех циклов, а затем копирую с char ** на char *** с некоторыми не столь простыми алгоритмами.

Есть ли простой способ разбиения массива строки на массив массивов строк? (Мне кажется тривиальной задачей разбивать массив на подстроки, но C делает это довольно сложно для меня)

Кроме того, я знаю, что я мог бы разбить вход на этих специальных символах, а затем получить массивы между ними, но меня интересует, как это можно сделать с разбиением массива.

+2

Посмотрите на функции 'strsep',' index' и/или 'strchr', чтобы помочь с этим. Нет стандартного способа делать такое разбиение на C, но это довольно просто реализовать. – hexist

ответ

0

В C массив представляет собой не что иное, как непрерывный кусок памяти. Вы должны сами обрабатывать проверки границ, чтобы вы могли просто сделать это. Другими словами, если у вас есть char **words, где слова [0] указывают на /bin/ls, слова [1] указывают на -l, слова [2] указывают на > и т. Д., Тогда у вас уже есть то, что вы хотите. В реальном коде, можно использовать char ***commands и динамически изменять размер в зависимости от количества команд, но для простого случая вы можете сделать:

char **first_command, **second_command, **third_command; 
first_command = words; 
second_command = words + 3; 
third_command = words + 5; 

Now first_command указывает на первый элемент массива {"/bin/ls", "-l"} (и, следовательно, он указывает к массиву), second_command указывает на первый элемент массива {"f.txt"} и т. д. Обратите внимание, что в этой настройке first_command[2] является ссылкой вне массива, но вам нужно отслеживать границы. Другими словами, не стоит копировать слова вокруг, просто отслеживайте, где они.

Смежные вопросы