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;
}
到目前为止,它正如我所期望的那样工作。但是,现在我需要在第一个维度(实际上是两个维度)中创建一个可变大小的二维数组。
我正在考虑做char * explode(char * toExplode, char * delimiter, int length = strlen(toExplode))
这样的事情,以便我可以指定长度或将其设置为默认值。这当然不起作用,我不知道从哪里开始。
任何想法/帮助?
答案 0 :(得分:3)
您可以传递已知的错误值(通常为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)
不,你不能,但这不会阻止你推入虚拟值(即-1),然后在函数中的第一件事,如果值为-1,则将其更改为您想要的任何值。
答案 2 :(得分:0)
在C中你不能。
这在C ++中是可行的,但是具有常量值(-1
),例如。
答案 3 :(得分:0)
如果您坚持使用C,那么我建议的解决方案是滚动两个功能;一个有长度,一个没有。
char * explode(char * toExplode, char * delimiter, int length)
{
...
}
char * explode(char * toExplode, char * delimiter)
{
int len = strlen(toExplode);
return explode(toExplode, delimiter, len);
}
所以,后者只为你计算出长度并将其传递给前者并返回结果。
答案 4 :(得分:0)
你不能在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;
/*...*/
}