我是C的新手并且正在开发一个项目,我需要能够获得一个子字符串,但是我遇到了困难,因为如果我尝试运行程序而有关于初始化和核心转储的编译器警告我不确定如何解决。
我有一个名为substring
的函数,它传入源字符串,起始索引和结束索引。
下面是我的子串函数。
char *substring(char * src, int from, int to)
{
char * dst = "\0";
strncpy(dst, src+from, to);
return dst;
}
以下是我调用函数的方法
char * debug = substring(rowReport[bPartyColIndex], 1, 2);
rowReport是MYSQL_ROW,而bPartyColIndex只是一个等于0的int,用于引用MYSQL_ROW中的正确列。
目前上面的行有一个编译器警告:
warning: initialization makes pointer from integer without a cast
我无法确定如何修复此警告。
如果我尝试运行程序,那么我会得到一个coredump,它表示在执行strncpy
的子字符串函数中它是一个分段错误。
答案 0 :(得分:3)
char * dst = "\0";
strncpy(dst, src+from, to);
这就是为什么会出现段错误的原因。使用dst
分配\0
是不正确的!实际上,dst
不足以存储src + from
个字节。你应该改为分配它:
char *substring(char * src, int from, int to)
{
size_t src_size = to + 1 - from;
char * dst = malloc(src_size); // Assuming str + from is ok
if (dst != 0)
strncpy(dst, src+from, src_size);
return dst;
}
在这种情况下,您必须免费dst
:
char * debug = substring(rowReport[bPartyColIndex], 1, 2);
puts(debug);
free(debug);
答案 1 :(得分:1)
您需要为子字符串分配新内存,或让调用者在所需的缓冲区中传递。你正在尝试的东西不起作用,你永远不会分配存储空间。
您需要以下内容:
char * substring(const char *str, int from, int to)
{
const size_t len = to - from + 1;
char *out = malloc(len + 1);
if(out != NULL)
{
memcpy(out, str + from, len);
out[len] = '\0';
}
return out;
}
然后调用者完成后需要free()
返回的指针。
答案 2 :(得分:1)
您的substring
功能本身存在一些问题。您没有为dst
分配任何空间并将其复制到其中。这可能会导致seg故障。您也没有检查我的from
或to
是否超出了字符串的结尾(可以使用strlen
进行检查)。
您还应该检查from
是否小于to
。
答案 3 :(得分:0)
首先:
char * dst = "\0";
strncpy(dst, src+from, to);
您正在写一个字符串文字,但字符串文字在C中是不可变的。这会调用未定义的行为。
第二
rowReport[bPartyColIndex]
必须是char *
,但它的类型不同。
您没有在问题中指定rowReport
的类型,但假设它是char
数组,则必须将&rowReport[bPartyColIndex]
而不是rowReport[bPartyColIndex]
传递给{{} 1}}功能。