双指针c内存故障

时间:2013-11-14 18:49:12

标签: c pointers char

基本上我需要编写一个split函数,目前我需要知道如何使用指向 s 的字符来填充子串

我有:

char *s = "--ab--c--";
char **substrings;
int split(char *s, int start, char sep, char **substrings, int max)

我不知道*s**substrings的定义是否正确。

我需要指定*s的指针,例如**substrings将包含:

{ "", "ab", "c", "" }

子串的正式定义

substrings - the array to populate with pointers to substrings of s

我不知道,我用Google搜索了双尖,无法弄明白。

*s的大小未知,**substrings的数量仅在程序执行时才知道。

我是C的新手,但我认为我需要这样的东西:

substrings[0][0] = "";
substrings[1][0] = "a";
substrings[1][1] = "c";
substrings[2][0] = "c";
substrings[3][0] = "a";

3 个答案:

答案 0 :(得分:1)

目前还不清楚split()例程的语义是什么,但我猜你的substrings应该是指针的数组

#define MAX_TOKENS  16 /* for example */
char* substrings[MAX_TOKENS];

split(s, ..., substrings, MAX_TOKENS);

答案 1 :(得分:0)

在运行时,您知道您不能拥有比s中包含字符更多的子字符串。因此,你可以为那么多的子串调用足够的空间,只使用你需要的空间。

  #include <stdlib.h>
  #include <string.h>

  char** substrings = (char**)calloc(strlen(s), sizeof(char));
  if (substrings == NULL) exit(1);

  // Split here

此时,您有一个数据结构,其中包含strlen(s)字符串的指针。拆分字符串时,将迭代这些指针,并将每个指针分配给您找到的新子字符串。

答案 2 :(得分:0)

由于您事先并不知道每个子字符串的子串数或大小,我建议使用calloc考虑最坏情况,这是:

substrings = calloc(strlen(s), strlen(s)*sizeof(char)); 

sizeof(char)应为1,但我只是出于教学原因而将其包括在内。

关于实施split功能的最佳方式,我认为最佳解决方案是使用strchr,它类似于:

int split(char *s, int start, char sep, char **substrings, int max)
{
    char *old, *sp;
    int i=0;
    old=s;

    sp=strchr(old,sep);    
    while (sp!=NULL && i < max)
    {
        if(0 < (sp-old))
            strncpy(substrings+i++, old, sp - old);
        old = sp+1;
        sp=strchr(old,sep);
    }

    // Last sub string
    if(0 < (s+strlen(s)-old))
        strncpy(substrings+i++, old, s+strlen(s)-old);

    return i;
}

对于您的建议输入,此解决方案将转储包含以下内容的数组:{"ab","c"}

我假设max定义了允许的最大子串数,并且substrings中的每个元素都有足够的空间来存储相应的子字符串(这两个条件都满足之前提出的calloc)。