我已经开始学习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))
的事情,这样我就可以指定长度或将其设置为默认值。当然,这是行不通的,我不知道从这里去哪里。
接下来我可以尝试什么?
5条答案
按热度按时间zmeyuzjn1#
您可以传递一个已知的错误值(通常是0或-1)作为长度,使用多个类似的函数或使用宏。
如果你走坏值路线,当你调用你的函数时,你可以给予它一个你知道不可能的值,并在函数开始时检查这样一个坏值。然后自动计算正确的值并照常继续。这样做的问题是,您现在被迫至少有一个坏值(在这种情况下不是问题)。
在多个相似函数方法中,每个函数的声明略有不同。它们不能都具有相同的名称,因为C不像C++那样支持重载。printf()函数族就是一个很好的例子。
宏方法是一个有点黑客,但它确实工作。它有点像前两个方法的组合,其中有两个不同的函数可以调用,但是第一个函数会被预处理,并自动传递一个错误的值给另一个函数,以便它可以计算出正确的长度值。
这样做的方式是,如果你只给予它前两个参数,0会作为第三个参数。如果你给予它三个参数,这三个参数都是正常传递的,而0被添加为隐藏在函数堆栈中的第四个不可见参数。如果你传递了三个以上的参数,所有额外的参数都将像0一样被隐藏。如果你试图只传递一个参数,你会得到以下错误:
bsxbgnwa2#
不,你不能,但这并不能阻止你推一个虚拟值(即。-1),然后在函数中的第一件事,如果值是-1,然后将其更改为您想要的任何值。
oxcyiej73#
如果你坚持使用C,那么我推荐的解决方案是滚动两个函数;一个有长度一个没有
因此,后者只是为您计算出长度,并将其传递给前者并返回结果。
fcy6dtqo4#
在C中,你不能。
这在C++中是可能的,但是例如使用常量(
-1
)。jbose2ul5#
你不能在C中重载一个函数,也没有默认参数,这是C++。
我能想到的唯一解决方案是有一个静态局部变量,使用默认值。