Я собираюсь предложить альтернативное решение вашей проблемы: используйте strtok. Он разбивает строку на подстроки на основе заданного c набора игнорируемых разделителей. С пустой строкой вы просто не получите никаких токенов.
Если вам нужно более сложное соответствие, чем это для вашей оболочки (например, для использования аргументов в кавычках), вам лучше написать небольшой токенизатор / лексер. Метод strtok в основном состоит в том, чтобы просто найти любой из указанных вами разделителей, временно заменить их на \ 0, вернуть подстроку до этой точки, вернуть старый символ и повторить, пока он не достигнет конца строки.
Редактировать: Как занятое пчела указывает в комментарии ниже, strtok не возвращает символ, который он заменяет на \ 0. Вышеупомянутый абзац был сформулирован плохо, но я намеревался объяснить, как реализовать собственный простой токенизатор / лексер, если вам нужно, а не объяснить, как strtok работает до мельчайших деталей.