对于这样的问题,最好编写自己的函数。虽然需要花费时间,但收益会很大。下面是一个名为
str_slice的函数代码,它非常类似于JavaScript的函数
string.slice(
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice)和Python的用于在字符串或数组上进行切片的特性(
https://docs.python.org/3.5/library/functions.html#slice)。此外,它仅基于C标准库,因此必须跨平台并与任何编译器一起使用。如果有疑问,请查看测试。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *
str_slice(char str[], int slice_from, int slice_to)
{
if (str[0] == '\0')
return NULL;
char *buffer;
size_t str_len, buffer_len;
if (slice_to < 0 && slice_from < slice_to) {
str_len = strlen(str);
if (abs(slice_to) > str_len - 1)
return NULL;
if (abs(slice_from) > str_len)
slice_from = (-1) * str_len;
buffer_len = slice_to - slice_from;
str += (str_len + slice_from);
} else if (slice_from >= 0 && slice_to > slice_from) {
str_len = strlen(str);
if (slice_from > str_len - 1)
return NULL;
buffer_len = slice_to - slice_from;
str += slice_from;
} else
return NULL;
buffer = calloc(buffer_len, sizeof(char));
strncpy(buffer, str, buffer_len);
return buffer;
}
测试
#include <assert.h>
void
test_str_slice()
{
char str[] = "abcdefghijkl";
assert(NULL == str_slice(str, -3, -10));
assert(NULL == str_slice(str, -1, -2));
assert(NULL == str_slice(str, -1, 0));
assert(NULL == str_slice(str, 1, 0));
assert(NULL == str_slice(str, 5, 4));
assert(NULL == str_slice(str, 0, 0));
assert(NULL == str_slice(str, 10, 10));
assert(NULL == str_slice(str, -2, -2));
assert(NULL == str_slice(str, -20, -12));
assert(NULL == str_slice(str, -20, -13));
assert(NULL == str_slice(str, 12, 13));
assert(NULL == str_slice(str, 12, 20));
assert(NULL == str_slice("", 1, 2));
assert(NULL == str_slice("", -2, -1));
assert(strcmp(str_slice(str, -3, -1), "jk") == 0);
assert(strcmp(str_slice(str, -8, -3), "efghi") == 0);
assert(strcmp(str_slice(str, -10, -9), "c") == 0);
assert(strcmp(str_slice(str, -2, -1), "k") == 0);
assert(strcmp(str_slice(str, -15, -1), "abcdefghijk") == 0);
assert(strcmp(str_slice(str, -12, -2), "abcdefghij") == 0);
assert(strcmp(str_slice(str, -15, -8), "abcd") == 0);
assert(strcmp(str_slice(str, -15, -11), "a") == 0);
assert(strcmp(str_slice(str, 1, 3), "bc") == 0);
assert(strcmp(str_slice(str, 11, 100), "l") == 0);
assert(strcmp(str_slice(str, 2, 4), "cd") == 0);
assert(strcmp(str_slice(str, 3, 6), "def") == 0);
assert(strcmp(str_slice(str, 0, 1), "a") == 0);
assert(strcmp(str_slice(str, 4, 6), "ef") == 0);
assert(strcmp(str_slice(str, 1, 2), "b") == 0);
assert(strcmp(str_slice(str, 0, 3), "abc") == 0);
assert(strcmp(str_slice(str, 0, 11), "abcdefghijk") == 0);
assert(strcmp(str_slice(str, 2, 10), "cdefghij") == 0);
assert(strcmp(str_slice(str, 0, 50), "abcdefghijkl") == 0);
}
从测试结果可以看出,这个函数返回一个字符串或者NULL。它支持负数和正数索引。这个想法来自于JavaScript和Python早期的特性。因此,请不要在答案中添加大量文本,我建议您阅读JavaScript和Python的文档。