是否可以为函数中的参数创建默认值?



我已经开始学习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("%sn", exploded); /* Should currently return 'is' */
    return 0;
}
到目前为止,它的工作正如我所期望的那样。但是,现在我需要在第一个维度(实际上是两个维度)创建一个可变大小的2D数组

我正在考虑做像char * explode(char * toExplode, char * delimiter, int length = strlen(toExplode))这样的事情,这样我就可以指定长度或将其设置为默认值。这当然不工作,但我不知道从这里去哪里。

接下来我可以尝试什么?

您可以传递一个已知的错误值(通常是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);
}

宏方法是一个hack,但它确实工作。它有点像前两种方法的组合,其中您可以调用两个不同的函数,但第一个函数经过预处理,并自动将错误值传递给另一个,以便它可以计算出正确的长度值。

#define explode (s, ...) explodel(s, __VA_ARGS__, 0)
char *  explodel(char * toExplode, char * delimiter, int length, ...);

的工作方式是,如果你只给它前两个参数,0将作为第三个参数。如果你给它三个参数,这三个参数都是正常传递的,0作为第四个不可见的参数被添加到函数堆栈中。如果传递的参数超过3,所有额外的参数都会像0一样被隐藏起来。如果您尝试只传递一个参数,您将得到以下错误:

error: expected expression before ',' token

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

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

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

因此,后者只是为您计算出长度并将其传递给前者并返回结果。

在C语言中你不能。

这在c++中是可能的,但是使用常量(-1),例如

你不能在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;
   /*...*/
}

相关内容

  • 没有找到相关文章