0

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

我有:

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

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

我需要将指针分配给*s包含以下内容的指针**substrings

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

子串的正式定义

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

我不知道,我用谷歌搜索了双指并无法弄清楚。

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

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

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

3 回答 3

1

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

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

split(s, ..., substrings, MAX_TOKENS);
于 2013-11-14T18:54:55.040 回答
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)。

于 2013-11-14T22:16:18.813 回答
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) 字符串的指针。当您拆分字符串时,您将遍历这些指针并将每个指针分配给您找到的新子字符串。

于 2013-11-14T19:22:45.020 回答