我正在学习C编程语言,我试图创建一个创建子字符串然后返回它的函数。 我找到了这段代码here:
void substring(char s[], char sub[], int p, int l) {
int c = 0;
while (c < l) {
sub[c] = s[p+c-1];
c++;
}
sub[c] = '\0';
}
我想摆脱参数中的char sub[]
,而是返回在函数内部创建的字符串。
这是我认为最接近的(我认为),但我总是遇到分段错误(核心转储)运行时错误。
char substring(char s[], int p, int l) {
int c = 0;
char sub[1000];
while (c < l) {
sub[c] = s[p+c-1];
c++;
}
sub[c] = '\0';
return *sub;
}
感谢您的帮助
答案 0 :(得分:3)
如果要返回一个字符串,则不应返回单个字符,而应返回char *。由于sub
是本地字符数组,因此您无法返回sub
。如果您坚持从函数返回指针,则需要分配动态内存。然后,呼叫者有责任释放记忆。因此你应该做这样的事情:
// NOTE: caller takes ownership of the returned value
char* substring(char s[], int p, int l) {
int c = 0;
char* sub = malloc(l + 1);
while (c < l) {
sub[c] = s[p+c-1];
c++;
}
sub[c] = '\0';
return sub;
}
注意:感谢@ MOehm的评论我注意到,当前面已知大小时,不需要分配固定大小为1000的字符串。这仍然可能导致逻辑更改,因此您可能需要更改其余代码。
答案 1 :(得分:2)
问题:
char
,这意味着您将返回单个字符。这应该是char*
,因为你想返回一个指向字符串开头的指针。 malloc
分配堆内存,将子字符串存储在该内存块中,然后返回指针。请注意,这意味着调用者需要获取此块的所有权(即在不需要之后free
。 请注意,此实现不必要地强制调用者使用堆内存。如果调用者想要将字符串放在其他地方(例如在内存映射文件中),则需要复制它。原始实现使用inout参数可能是为了避免这种妥协。
答案 2 :(得分:1)
正如其他答案中已经提到的,您无法返回指向局部变量的指针。事实上,最好的办法是不要关心内存分配,而是将其留给调用者:
void substring (size_t index,
size_t length,
const char source[],
char dest[length+1])
{
memcpy(dest, source + index, length);
dest[length] = '\0';
}