为了账号安全,请及时绑定邮箱和手机立即绑定

C中带有分隔符的拆分字符串

C中带有分隔符的拆分字符串

C++ C
墨色风雨 2019-06-05 15:58:51
C中带有分隔符的拆分字符串如何编写函数来拆分和返回C编程语言中带有分隔符的字符串的数组?char* str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC";str_split(str,',');
查看完整描述

3 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

我认为strsep仍然是最好的工具:

while ((token = strsep(&str, ","))) my_fn(token);

从字面上说,这是一条分隔字符串的行。

额外的括号是一个样式元素,表示我们有意测试赋值的结果,而不是相等操作符。==.

为了让这种模式发挥作用,tokenstr两者都有类型char *..如果以字符串文字开头,那么首先要复制它:

// More general pattern:const char *my_str_literal = "JAN,FEB,MAR";char *token, *str, *tofree;tofree = str = strdup(my_str_literal);  
// We own str's memory now.while ((token = strsep(&str, ","))) my_fn(token);free(tofree);

如果两个分隔符同时出现在str,你会得到一个token值,这是空字符串。价值str被修改,因为遇到的每个分隔符都被一个零字节覆盖-这是复制首先解析的字符串的另一个很好的理由。

在评论中,有人建议strtokstrsep因为strtok更便于携带。Ubuntu和MacOSXstrsep这是安全的猜测,其他单一系统也是如此。窗缺strsep,但它有strbrk使这短暂而甜蜜的strsep替换:

char *strsep(char **stringp, const char *delim) {
  if (*stringp == NULL) { return NULL; }
  char *token_start = *stringp;
  *stringp = strpbrk(token_start, delim);
  if (*stringp) {
    **stringp = '\0';
    (*stringp)++;
  }
  return token_start;}

这里是一个很好的解释strsepVSstrtok..利弊可能是主观判断的,不过,我认为这是一个很好的迹象strsep被设计为strtok.


查看完整回答
反对 回复 2019-06-05
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

字符串标记器-这段代码应该将您带到正确的方向。

int main(void) {
  char st[] ="Where there is will, there is a way.";
  char *ch;
  ch = strtok(st, " ");
  while (ch != NULL) {
  printf("%s\n", ch);
  ch = strtok(NULL, " ,");
  }
  getch();
  return 0;}


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 809 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信