在C中获取子字符串的问题

时间:2013-07-01 13:46:03

标签: c substring

我是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 个答案:

答案 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故障。您也没有检查我的fromto是否超出了字符串的结尾(可以使用strlen进行检查)。

您还应该检查from是否小于to

答案 3 :(得分:0)

首先:

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

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

第二

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

您没有在问题中指定rowReport的类型,但假设它是char数组,则必须将&rowReport[bPartyColIndex]而不是rowReport[bPartyColIndex]传递给{{} 1}}功能。