[英]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.