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);