【问题标题】:split string through strtok in c languagec语言中通过strtok分割字符串
【发布时间】:2013-09-10 18:12:28
【问题描述】:

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

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

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

【问题讨论】:

  • strtok 的第二个参数是一系列要拆分的字符,例如 strtok(string, ";,") 将拆分第一个 ,;
  • 是否有可能在整个字符串上发生拆分。单个字符
  • 在循环中使用strstr

标签: c string tokenize


【解决方案1】:

要使用多个字符拆分字符串,您可以在循环中使用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:如果有人愿意,请编辑代码,使其更好一点。

【讨论】:

  • 很好的例子。高达 70% 我的问题已解决。但是你能不能用这个字符串检查它,然后看看程序的行为。“这是一个很长的 \r 文本 \r\n 带有 \r\n 很多回车,\我讨厌 \r\n 只是这个\r\ n 没有别的\r\n";
  • 如果我理解了您的问题,我相信您的问题 100% 已解决。刚刚运行了几个小时前我发布的代码,用“\r\n”替换了所有“ggg”,我制作了我将用上面编辑帖子的图像。
【解决方案2】:

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

[EDITED] 来自一篇出色的帖子 here,并引用了 this guy 的优秀代码>

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

#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”我使用上面的代码得到了这个结果:

【讨论】:

  • 你能举个例子吗,真的很感激
【解决方案3】:

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

【讨论】:

    【解决方案4】:
    /* 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
    

    【讨论】:

    • 谢谢人。你能告诉我任何可能性,以便字符串在整个字符串的出现时分裂。???我真的需要这个
    • @P0W - 抄袭是奉承的最高形式。它具有说明性、(某种)相关性和显着性。 (Kind of) 因为它确实没有回答如何在每次出现 sub-string 时打破字符串的问题。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2020-11-07
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多