【问题标题】:Issue with getting substring in C在 C 中获取子字符串的问题
【发布时间】:2013-07-01 13:46:02
【问题描述】:

我是 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 的子字符串函数中的分段错误。

【问题讨论】:

    标签: c substring


    【解决方案1】:
    char * dst = "\0";
    strncpy(dst, src+from, to);
    

    这就是为什么会有段错误。用\0 分配dst 是不正确的!实际上,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);
    

    【讨论】:

      【解决方案2】:

      您需要为子字符串分配新内存,或者让调用者传入所需的缓冲区。您尝试的方法不起作用,您永远不会分配存储空间。

      你需要这样的东西:

      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()返回的指针。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          第一:

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

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

          第二:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-27
            • 2011-05-25
            • 2012-01-26
            相关资源
            最近更新 更多