繁体   English   中英

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

[英]Is it possible to create a default value for an argument in a function with C?

好吧,请原谅我。 我已经开始学习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))这样的事情,以便我可以指定长度或将其设置为默认值。 当然这是行不通的,而且我不知道从这里去哪里。

有任何想法/帮助吗?

您可以传递已知的错误值(通常为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​​),然后将其更改为所需的任何值。

在C中,您不能。

这在C ++中是可能的,但是具有恒定值( -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 ++。

我能想到的唯一解决方案是使用默认值的静态局部变量。

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;

   /*...*/
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM