首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C中的strsep()处理连续分隔符

用C中的strsep()处理连续分隔符
EN

Stack Overflow用户
提问于 2022-03-27 12:51:42
回答 1查看 176关注 0票数 0

我试图用strsep()函数逐字读取C中的字符串,这也可以使用strtok()来完成。当有连续的分隔符时,-in (我的情况下)空空间--函数不会忽略它们。预计我将使用strsep(),但无法找到解决方案。如果你们中的一个能帮我,我会很感激的。

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main(){

  char newLine[256]= "scalar             i";

  char *q;
  char *token;
  q = strdup(newLine);

  const char delim[] = " ";
    
  token = strsep(&q, delim);
  printf("The token is: \"%s\"\n", token);
    
  token = strsep(&q, delim);    
  printf("The token is: \"%s\"\n", token);

  return 0;
} 

实际产出如下:

代码语言:javascript
复制
The token is: "scalar"
The token is: ""

我所期望的是:

代码语言:javascript
复制
The token is: "scalar"
The token is: "i"

要做到这一点,我还尝试编写一个while循环,以便可以继续,直到令牌是非空的。但我不能将令牌等同于"“、”“、”空“或"\n”。不知何故,这个标记并不等于这其中任何一个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-27 13:02:34

首先要注意的是,strsep()虽然方便,但并不在标准C库中,只能在具有BSD-4.4C库支持的Unix系统上使用。这是当今大多数Unix‘’ish系统,但仍然如此。

无论如何,strsep()支持空字段。这意味着如果您的字符串有连续的分隔符,它将在每个分隔符之间找到空的、长度-0的标记。例如,字符串"ab cd"的令牌将是:

  1. "ab"
  2. ""
  3. "cd"

2个分隔符,-> 3标记。

现在,你还说:

I不能将令牌等同于"“、”“、”NULL“或"\n”。不知何故,这个标记并不等于这其中任何一个。

我猜你想做的只是简单的比较,例如if (my_token == "") { ... }。这是行不通的,因为这是指针的比较,而不是字符串内容的比较。两个字符串在内存中的不同位置可能有相同的字符,特别是我刚才给出的示例,因为my_token将是动态的,并且不会指向比较中使用的静态存储持续时间字符串""

相反,您需要使用strcmp(my_token,""),或者更好的是,只需手动检查第一个字符是'\0'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71636490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档