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

hgqdbh6s  于 2023-05-22  发布在  其他
关注(0)|答案(5)|浏览(244)

我已经开始学习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;
}

到目前为止,它的工作就像我期望的那样。但是,现在我需要在第一维(实际上是两个维度)创建一个大小可变的2D数组。
我正在考虑做一些类似char * explode(char * toExplode, char * delimiter, int length = strlen(toExplode))的事情,这样我就可以指定长度或将其设置为默认值。当然,这是行不通的,我不知道从这里去哪里。
接下来我可以尝试什么?

zmeyuzjn

zmeyuzjn1#

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

bsxbgnwa2#

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

oxcyiej7

oxcyiej73#

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

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

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

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

fcy6dtqo

fcy6dtqo4#

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

jbose2ul

jbose2ul5#

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

   /*...*/
}

相关问题