字符串在C中拆分

时间:2013-09-22 00:06:28

标签: c

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

My String由我的Struct定义:

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 splitting a char* into an char**

那么,我该如何做呢?

5 个答案:

答案 0 :(得分:0)

如果您没有使用* nix,那么您正在寻找strtok,请查看man 3 strtokhere

您可以这样使用它:(假设您可以自己编写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,然后对副本进行操作。< / p> 编辑: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 */
}

答案 1 :(得分: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;

}

答案 2 :(得分: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);
}

答案 3 :(得分:0)

你看过strtok吗?应该可以使用strtok执行此操作。

答案 4 :(得分: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);
}