我有一种情况,我在内存中有一个大字符串,我想用函数提供这个片段(例如,从30开始给我14个字符串运行).为了使这项工作,我不得不让消费者使用双指针作为他们的缓冲区.
void foo(char** bar)
{
char* tmp = "nope";
*bar = &tmp[1];
}
int main (int argc, char const *argv[])
{
char* baz = "yep";
foo(&baz);
printf("%s", baz);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我查看pread或strcpy等各种库函数,它们只接受一个指针级别的字符串缓冲区.
他们是怎么做到的?看起来他们应该需要一个双指针以同样的方式更改"另一边"的值.
大多数此类函数不会更改指针,它们会更改内存.原型strcpy()是:
char * strcpy(char *dest, const char *source);
Run Code Online (Sandbox Code Playgroud)
这意味着指向的内存dest将被内容覆盖source,直到(并包括)找到第一个0字符.
调用者将使用要修改的缓冲区的地址调用它.
对于你的情况,听起来你是在零复制字符串切片之后,然后使用指针指针更有意义.请注意,终止将成为一个问题,您无法复制C字符串而无需复制,否则原始也将被切片.
您当然可以定义复制字符串切片功能:
char * slice_string(char *dest, size_t dest_max,
const char *source, int start_index, int end_index);
Run Code Online (Sandbox Code Playgroud)
这将从字符复制source到dest,只是喜欢strcpy(),但只复制子串.我做了索引签名,所以你可以支持负索引,例如Python.
请注意,不会调用strslice()该函数,因为该函数名称是保留的.