-1

我是 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.

4

4 回答 4

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);
于 2013-07-01T13:50:31.647 回答
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()在完成后需要返回的指针。

于 2013-07-01T13:51:39.023 回答
1

您的substring功能本身存在一些问题。您没有为它分配任何空间dst并复制到其中。这可能导致段错误。您也没有检查是否任何一个fromto我超出了字符串的结尾(可以用 进行检查strlen)。

您还应该检查from小于to

于 2013-07-01T13:51:57.823 回答
0

第一的:

   char * dst = "\0";
   strncpy(dst, src+from, to);

您正在写入字符串文字,但字符串文字在 C 中是不可变的。这会调用未定义的行为。

第二:

rowReport[bPartyColIndex]必须是 achar *但它是不同的类型。

你没有rowReport在你的问题中指定类型,但假设它是一个char你必须传递而&rowReport[bPartyColIndex]不是函数的数组。rowReport[bPartyColIndex]substring

于 2013-07-01T13:46:49.073 回答