Можно ли создать значение по умолчанию для аргумента в функции с C? - PullRequest
0 голосов
/ 08 сентября 2011

Хорошо, так что прости меня.Я начал изучать C и, исходя из PHP, я ненавижу отсутствие explode(), поэтому я решил создать свой собственный.

Вот что у меня есть:

#include <stdio.h>
#include <windows.h>

char * explode(char * toExplode, char * delimiter) /* Need to add a buffer size here */
{
    char * token;
    token = strtok(toExplode, delimiter);
    token = strtok(NULL, delimiter);

    return token;
}

int main(void)
{
    char string[] = "This is a string yaaaaay";
    char * exploded;

    exploded = explode(string, " ");
    printf("%s\n", exploded); /* Should currently return 'is' */

    return 0;
}

Пока это работает так, как я ожидаю.Однако теперь мне нужно создать двумерный массив переменного размера в первом измерении (на самом деле, оба измерения.)

Я думал сделать что-то вроде char * explode(char * toExplode, char * delimiter, int length = strlen(toExplode)), чтобы я мог указать длину или иметьэто установило это по умолчанию.Это, конечно, не работает, и я понятия не имею, куда идти.

Любые идеи / помощь?

Ответы [ 5 ]

3 голосов
/ 08 сентября 2011

Вы можете передать известное неверное значение (обычно 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
1 голос
/ 08 сентября 2011

Нет, вы не можете, но это не мешает вам ввести фиктивное значение (то есть -1), а затем первым делом в функции, если значение равно -1, затем изменить его на любое значение, которое вы хотите.

0 голосов
/ 08 сентября 2011

Вы не можете перегрузить функцию в C, ни иметь аргументы по умолчанию, это C ++.

Единственное решение, которое я могу придумать, - иметь статическую локальную переменную со значением по умолчанию.

char * explode(char * toExplode, char * delimiter,unsigned int plen) /* Need to add a buffer size here */
{
    static unsigned int slen = 100;
    unsigned int len; 
    char * token;

    if (plen!=0)
        len = plen;
    else
        len = slen;

   /*...*/
}
0 голосов
/ 08 сентября 2011

Если вы застряли с помощью C, то решение, которое я бы порекомендовал, заключается в переходе на две функции;один с длиной, другой без.

char * explode(char * toExplode, char * delimiter, int length)
{
   ...
}

char * explode(char * toExplode, char * delimiter)
{
   int len = strlen(toExplode);
   return explode(toExplode, delimiter, len);
}

Итак, последний просто вычисляет длину для вас, передает ее первому и возвращает результат.

0 голосов
/ 08 сентября 2011

В Си ты не можешь.

Это возможно в C ++, но с постоянным значением (-1), например.

...