0

我想在 C 中拆分一个字符串。

我的字符串由我的结构定义:

struct String
{   
    char *c;   
    int length;             
    int maxLength;      
}

然后我有一个进行拆分的函数。也许 C 有一些东西可以做到这一点,但是虽然我想要我自己的,但到目前为止我还没有找到任何可以做到这一点的东西。

String ** spliter(String *s)
{
   if(s == NULL)
     return NULL;

   // set of splitters: {'\n', ' '}

}

输入看起来像这样:This is Sparta. 然后我想返回一个指向每个字符数组的指针。

*p1 = This
*p2 = is
*p3 = Sparta.

如果这有任何意义,我想要一个指针数组,每个指针都指向一个字符数组。

当我增加每个字符数组的大小时,我将不得不重新分配字符串。可能我最大的问题是想象指针是如何工作的。

类似问题:c 将 char* 拆分为 char**

那么,我该怎么做呢?

4

5 回答 5

0

这是一个例子:

String ** spliter(String *s)                                                                                                                                                                                        
{
  int  i;
  int j;
  char *p1;
  char *p2;
  char *p3;

  i = 0;
  j = 0;
  if(s == NULL)
    return NULL;
  p1 = malloc(sizeof(*p1) * strlen(s));
  p2 = malloc(sizeof(*p2) * strlen(s));
  p3 = malloc(sizeof(*p3) * strlen(s));
  while (s[i] != ' ')
    {
      p1[j++] = s[i];
      i++;
    }
  i++;
  j = 0;
  while (s[i] != ' ')
    {
      p2[j++] = s[i];
      i++;
    }
  i++;
  j = 0;
  while (s[i] != '\0')
    {
      p3[j++] = s[i];
      i++;
    }
  printf("%s\n", p1);
  printf("%s\n", p2);
  printf("%s\n", p3);
}
于 2013-09-22T00:22:39.547 回答
0

你看过strtok吗?使用 strtok 应该可以做到这一点。

于 2013-09-22T00:23:18.683 回答
0

如果您不在 *nix 上,您正在寻找strtok、查看man 3 strtok在这里。

您可以这样使用它:(假设您可以add_string自己编写代码。)

String ** spliter(String *s)
{
   if(s == NULL)
     return NULL;

    String **return_strings = NULL;
    char *delim = " \n";
    char *string = strtok(s, delim);
    int i = 0;


    for(i = 0; add_string(return_strings, string, i) != -1; i++) {
        string = strtok(NULL, delim);
    }

    return strings;
}

请注意,如果您需要保存原始字符串(strtok修改它所处理的字符串),您需要调用strdup原始字符串,然后对副本进行操作。

编辑: OP 说他在考虑指针时遇到了麻烦。使用上面的代码示例,add_string只需要担心处理字符串,而不是指向字符指针的指针数组。所以它可能看起来像这样:

int add_string(String **strings, char *s, int len)
{
    if(s == NULL)
        return -1;

    String *current_string = NULL;
    strings = realloc(strings, sizeof(String) * (len + 1));
    current_string = strings[len];

    /* fill out struct fields here */
}
于 2013-09-22T00:17:49.893 回答
0
#include <string>
#include <iostream>
#include <vector>
using namespace std;


int main()
{
    string test = "aa aa bbc cccd";
    vector<string> strvec;
    string strtemp;

    string::size_type pos1, pos2;
    pos2 = test.find(' ');
    pos1 = 0;        
    while (string::npos != pos2)
    {
            strvec.push_back(test.substr(pos1, pos2 - pos1));

            pos1 = pos2 + 1;
            pos2 = test.find(' ', pos1);
    }
    strvec.push_back(test.substr(pos1));

    vector<string>::iterator iter1 = strvec.begin(), iter2 = strvec.end();
    while (iter1 != iter2)
    {
            cout << *iter1 << endl;
            ++iter1;
    } 

    return 0;

}
于 2013-09-22T00:17:53.803 回答
0

添加 strdup 和 strtok 可以处理字符串的副本。split() 调用比其他 spliter() 示例更通用,但对 strtok 重复执行相同的操作。

char **
split(char **result, char *w, const char *src, const char *delim)
{
    int i=0;
    char *p;
    strcpy(w,src);
    for(p=strtok(w, delim) ; p!=NULL; p=strtok('\0', delim) )
    {
        result[i++]=p;
        result[i]=NULL;
    }
    return result;
}

void display(String *p)
{
   char *result[24]={NULL};
   char *w=strdup(p->c);
   char **s=split(result, w, p->, "\t \n");  split on \n \t and space as delimiters
   for( ; *s!=NULL; s++)
      printf("%s\n", *s);
   free(w);
}
于 2013-09-22T00:36:50.713 回答