user11954200
user11954200

Reputation:

A way to pass an optional argument to a function

Take the following function:

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;

}

I can call this as follows:

char * new_string = slice("old string", 3, 5)

Is there a way to be able to "omit" an argument somehow in C? For example, passing something like the following:

char * new_string = slice("old string", 3, NULL)
// NULL means ignore the  `end` parameter and just go all the way to the end.

How would something like that be done? Or is that not possible to do in C?

Upvotes: 1

Views: 117

Answers (2)

Joshua
Joshua

Reputation: 43280

There's only two ways to pass optional arguments in C, and only one is common. Either pass a pointer to the optional argument and understand NULL as not passed, or pass an out-of-range value as not passed.

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

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

BTW, this example should really be using size_t and SIZE_MAX but I copied your prototype.

The proposed dupe target is talking about vardiac functions, which do have optional arguments, but it's not like what you're asking for. It's always possible in such a function call to determine if the argument is (intended to be) present by looking at the arguments that come before. In this case, that won't help at all.

Upvotes: 0

Kevin Montambault
Kevin Montambault

Reputation: 618

Optional arguments (or arguments that have default values) are not really a thing in C. I think you have the right idea by passing in 'NULL', except for that NULL is equal to 0 and will be interpreted as an integer. Instead, I would recommend changing the argument to a signed integer instead of unsigned, and passing in a -1 as your flag to indicate that the argument should be ignored.

Upvotes: 1

Related Questions