C 将可选参数传递给函数的一种方法
执行以下功能:C 将可选参数传递给函数的一种方法,c,C,执行以下功能: char * slice(const char * str, unsigned int start, unsigned int end) { int string_len = strlen(str); int slice_len = (end - start < string_len) ? end - start : string_len; char * sliced_str = (char *) malloc (slice_len + 1);
char * slice(const char * str, unsigned int start, unsigned int end) {
int string_len = strlen(str);
int slice_len = (end - start < string_len) ? end - start : string_len;
char * sliced_str = (char *) malloc (slice_len + 1);
sliced_str[slice_len] = '\0';
// Make sure we have a string of length > 0, and it's within the string range
if (slice_len == 0 || start >= string_len || end <= 0) return "";
for (int i=0, j=start; i < slice_len; i++, j++)
sliced_str[i] = str[j];
return sliced_str;
}
有没有一种方法可以在C语言中以某种方式“省略”参数?例如,传递如下内容:
char * new_string = slice("old string", 3, NULL)
// NULL means ignore the `end` parameter and just go all the way to the end.
这样的事情怎么办?或者这在C语言中是不可能的?可选参数(或具有默认值的参数)在C语言中并不是一件真正的事情。我认为您传入“NULL”是正确的想法,除了NULL等于0并将被解释为整数之外。相反,我建议将参数更改为有符号整数而不是无符号整数,并将-1作为标志传递,以指示应忽略该参数。在C中传递可选参数的方法只有两种,只有一种是常见的。传递指向可选参数的指针并将NULL理解为未传递,或者传递超出范围的值作为未传递 方式1:
char * slice(const char * str, const unsigned int *start, const unsigned int *end);
// ...
const unsigned int three = 3;
char * new_string = slice("old string", &three, NULL)
方式2:
#include <limits.h>
char * slice(const char * str, const unsigned int start, const unsigned int end);
char * new_string = slice("old string", 3, UINT_MAX);
#包括
字符*切片(常量字符*字符串,常量无符号整数开始,常量无符号整数结束);
char*new_string=slice(“旧字符串”,3,UINT_MAX);
顺便说一句,这个例子应该使用size\u t
和size\u MAX
但是我复制了你的原型
建议的dupe目标是讨论vardiac函数,它确实有可选参数,但与您要求的不同。在这样的函数调用中,总是可以通过查看前面的参数来确定参数是否(打算)存在。在这种情况下,这一点都没有帮助。我认为这是问题的一个副本C中不可能的可能的副本。但在您的情况下,它可以通过使用if语句轻松解决,因为char*是零终止的。顺便说一句,POSIX标准已经有了您自己实现的函数:
char*slice(const char*str,size_t start,size_t end){return strndup(str+start,end-start)}
哪种是常用的方法?@Shared:First-one。
#include <limits.h>
char * slice(const char * str, const unsigned int start, const unsigned int end);
char * new_string = slice("old string", 3, UINT_MAX);