用c语言将字符串拆分为strtok

时间:2013-09-10 18:12:29

标签: c string tokenize

我正在通过strtok拆分字符串,但发生了不同的事情,例如

 *tok =strtok(string,"\r\n");

strtok只找到\r然后它拆分字符串而不是整个\r\n,我希望字符串只有在数据\r\n中出现整个字符串时才会被拆分;

4 个答案:

答案 0 :(得分:2)

要使用多个字符拆分字符串,您可以在循环中使用strstr

只需反复调用strstr即可查找边界字符串的出现次数。

获得结果后,将指针推进子字符串的长度并再次重复搜索。

这是一个丑陋的例子,但我认为它可以满足您的需求

#include <stdio.h>
#include <string.h>

int main ()
{
  char buffer[128];
  char *str ="This is a long text \r\n with \r\nmany carriage returns,\
  I hate \r\n just this\r\n nothing else\r\n";

  char *token="\r\n";

  int l=strlen(str);
  char *start,*p;
  start=str;

  p= strstr (str,token);
  while(p)
  {
     strncpy( buffer,str, p-str);
     buffer[p-str] ='\0';

     printf("%s\n",buffer);

     str=p+strlen(token);

     if((str-start) >= l)
        break;

     p= strstr (str,token);
 }
 if(!p)
   printf("%s\n",str);
 return 0;
}

参见 HERE

PS:如果有人想要,请编辑代码,使其更好。

答案 1 :(得分:1)

如果要根据子字符串的出现(例如“\ r \ n”)拆分字符串,则必须使用字符串搜索功能,例如char * strstr(,)。 strstr()将返回指向匹配的子字符串的指针。然后,您可以在该点操纵结果字符串,从结果中删除strlen(“\ r \ n”)个字节,然后继续搜索。

[EDITED]来自优秀帖子 here ,并提及 this guy

m-qayyums代码在循环中调用,向您展示如何使用另一个子字符串查找(和替换)子字符串的多次出现,甚至是使用strstr(,)et的空字符串。人。

#include <ansi_c.h>
#include <stdio.h>
#include <string.h>

char *replace_str(char *str, char *orig, char *rep);

int main ()
{
    char origStr[]={"this is anggg originalggg lineggg ogggf texgggt"};
    char newString[]={"this is anggg originalggg lineggg ogggf texgggt"};


    sprintf(newString, "%s", origStr);
    while(strstr(newString, "ggg"))
    {
        sprintf(newString, "%s", replace_str(newString, "ggg", ""));
    }
    printf("Original String:  %s\n", origStr);
    printf("New      String:  %s\n", newString);

    getchar();

    return 0;
}


char *replace_str(char *str, char *orig, char *rep)
{
  static char buffer[4096];
  char *p;

  if(!(p = strstr(str, orig)))  // Is 'orig' even in 'str'?
    return str;

  strncpy(buffer, str, p-str); // Copy characters from 'str' start to 'orig' st$
  buffer[p-str] = '\0';

  sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));

  return buffer;
}

[EDIT_2]用“\ r \ n”替换“ggg”我使用上面的代码得到了这个结果:

enter image description here

答案 2 :(得分:0)

如果您使用的是* nix系统,则可以使用POSIX Regex库来实现此结果,如here所述。

答案 3 :(得分:-1)

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

输出:

Splitting string "- This, a sample string." into tokens:
This
a
sample
string