编辑 3:对于代码本身,请一起检查第一个答案或这篇文章的结尾。
如标题中所述,我试图找到一种方法来判断可选参数是否已传递给函数。我想做的是几乎所有动态语言如何处理它们的子字符串函数。下面是我目前的,但它不起作用,因为我不知道如何判断是否/何时使用该东西。
char *substring(char *string,unsigned int start, ...){
va_list args;
int unsigned i=0;
long end=-1;
long long length=strlen(string);
va_start(args,start);
end=va_arg(args,int);
va_end(args);
if(end==-1){
end=length;
}
char *to_string=malloc(end);
strncpy(to_string,string+start,end);
return to_string;
}
基本上我希望仍然能够不包含我想要返回的字符串的长度,而只是让它走到字符串的末尾。但我似乎找不到办法做到这一点。由于也无法知道 C 中传递的参数数量,这让我失去了第一个想法。
编辑:这是当前代码的新方法。
#define substring(...) P99_CALL_DEFARG(substring, 3, __VA_ARGS__)
#define substring_defarg_2 (0)
char *substring(char *string,unsigned int start, int end){
int unsigned i=0;
int num=0;
long long length=strlen(string);
if(end==0){
end=length;
}
char *to_string=malloc(length);
strncpy(to_string,string+start,end);
return to_string;
}
然后在一个文件中我调用 test.c 看看它是否有效。
#include "functions.c"
int main(void){
printf("str:%s",substring("hello world",3,2));
printf("\nstr2:%s\n",substring("hello world",3));
return 0;
}
functions.c 有一个包含 functions.h 的内容,其中包括所有需要的内容。这是 clang 输出(因为 clang 似乎通常会提供更多细节。
In file included from ./p99/p99.h:1307:
./p99/p99_generic.h:68:16: warning: '__error__' attribute ignored
__attribute__((__error__("Invalid choice in type generic expression")))
^
test.c:4:26: error: called object type 'int' is not a function or function
pointer
printf("\nstr2:%s\n",substring("hello world",3));
^~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from test.c:1:
In file included from ./functions.c:34:
In file included from ./functions.h:50:
./string.c:77:24: note: instantiated from:
#define substring(...) P99_CALL_DEFARG(substring, 3, __VA_ARGS__)
GCC 只是说对象不是函数
编辑 2:请注意,将其设置为 -1 也不会改变它,它仍然会引发同样的事情。我使用的编译选项如下。
gcc -std=c99 -c test.c -o test -lm -Wall
Clang 是一回事(它是否适用是另一个问题。
在这里回答
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include "p99/p99.h"
#define substring(...) P99_CALL_DEFARG(substring, 3, __VA_ARGS__)
#define substring_defarg_2() (-1)
char *substring(char *string, size_t start, size_t len) {
size_t length = strlen(string);
if(len == SIZE_MAX){
len = length - start;
}
char *to_string = malloc(len + 1);
memcpy(to_string, string+start, len);
to_string[len] = '\0';
return to_string;
}
您将需要从那里获得 p99。它是由选定的答案。只需放入您的源目录,您应该就可以了。还要总结他对许可证的回答。你可以随心所欲地使用它,但你基本上不能分叉它。因此,出于此目的,您可以在任何项目中自由使用它和字符串函数,无论是专有的还是开源的。
我唯一要问的是,你至少给这个线程一个链接,以便发生在它上面的其他人可以了解堆栈溢出,因为这就是我对在这里得到帮助的事情发表评论的方式。