Вы можете передать известное неверное значение (обычно 0 или -1) как длину, иметь несколько похожих функций или использовать макрос.
Если вы идете по пути неверного значения, когда вы вызываете свою функцию, вы можете присвоить ей значение, которое, по вашему мнению, невозможно, и проверить такое плохое значение в начале функции. Затем автоматически рассчитайте правильное значение и продолжайте как обычно. Проблема в том, что теперь вы вынуждены иметь хотя бы одно неверное значение (в данном случае это не проблема).
char * explode(char * toExplode, char * delimiter, int length){
if(length == 0)
length = ...;
В методе множественных аналогичных функций каждая функция имеет несколько другое объявление. Они не могут иметь одно и то же имя, потому что C не поддерживает перегрузку, как у другого языка, такого как C ++. Семейство функций printf () является хорошим примером этого.
char * explodel(char * toExplode, char * delimiter, int length);
char * explode (char * toExplode, char * delimiter){
int length = ...;
return explodel(toExplode, delimiter, length);
}
Метод макроса - это что-то вроде хака, но он работает. Это небольшая комбинация двух предыдущих методов, в которой у вас есть две разные функции, которые вы можете вызвать, но первая из них предварительно обрабатывается с неверным значением, которое автоматически передается другому, чтобы можно было определить правильное значение длины .
#define explode (s, ...) explodel(s, __VA_ARGS__, 0)
char * explodel(char * toExplode, char * delimiter, int length, ...);
Способ, которым это работает, заключается в том, что если вы дадите ему только первые два аргумента, 0 станет третьим аргументом. Если вы дадите ему три аргумента, все три будут переданы нормально, а 0 добавлен как четвертый невидимый аргумент, спрятанный в стеке функций. Если вы передадите больше трех, все дополнительные аргументы будут скрыты как 0. Если вы попытаетесь передать только один аргумент, вы получите следующую ошибку:
error: expected expression before ',' token