是否可以使用C为函数创建参数的默认值?

时间:2011-09-08 10:48:23

标签: c arrays multidimensional-array explode

好的,原谅我。我已经开始学习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 个答案:

答案 0 :(得分:3)

您可以传递已知的错误值(通常为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 :(得分:1)

不,你不能,但这不会阻止你推入虚拟值(即-1),然后在函数中的第一件事,如果值为-1,则将其更改为您想要的任何值。

答案 2 :(得分:0)

在C中你不能。

这在C ++中是可行的,但是具有常量值(-1),例如。

答案 3 :(得分:0)

如果您坚持使用C,那么我建议的解决方案是滚动两个功能;一个有长度,一个没有。

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

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

所以,后者只为你计算出长度并将其传递给前者并返回结果。

答案 4 :(得分:0)

你不能在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;

   /*...*/
}