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