2

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

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

strtok 找到时才\r拆分字符串而不是整个字符串\r\n,我希望仅当数据中出现整个字符串时才拆分字符串\r\n

4

4 回答 4

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;
}

这里

PS:如果有人愿意,请编辑代码,使其更好一点。

于 2013-09-10T19:07:10.330 回答
1

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

[EDITED] 来自这里的一篇优秀文章,其中引用了这个人的优秀代码

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

在此处输入图像描述

于 2013-09-10T18:22:10.893 回答
0

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

于 2013-09-10T18:19:42.350 回答
-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
于 2013-09-10T18:17:26.557 回答