【问题标题】:Strchr and strrchr returning same resultstrchr 和 strrchr 返回相同的结果
【发布时间】:2019-11-26 03:02:09
【问题描述】:

出于某种原因,无论我尝试strchr 还是strrchr,都会返回相同的值。我不知道为什么。

这是给我带来麻烦的代码段:

      printf("Enter a data point (-1 to stop input):\n");
      fgets(input, 50, stdin);
      char *name = strrchr(input, ',');
      if(name)
      {
         printf("%s", name);
      }

输入是Jane Austen, 6,我试图将它分成两个字符串:一个在逗号之前,一个在逗号之后。但是,我使用strrchr(input, ',');strchr(input, ','); 似乎毫无意义,因为我的输出总是, 6。谁能解释一下原因?

【问题讨论】:

  • 如果字符串中只有一个逗号,那么无论您要查找该字符的“第一个”还是“最后一个”,都会找到相同的逗号。

标签: c string pointers string.h c-str


【解决方案1】:

听起来你想要strtok

char *name = strtok(input, ",");
char *value = strtok(NULL, ",");

【讨论】:

  • 我认为这可行,谢谢。我错误地认为 strchr 和 strrcr 之间的唯一区别是一个从索引 0 开始,另一个从索引长度 - 1 开始。
  • 唯一的区别 - strchr 从索引 0 开始并向前,strrchrstrlen(s) - 1 开始并向后。正如@SteveFriedl 指出的那样,如果您只有一个,,那么这两个将找到相同的结果。它们只会真正为您提供字符的位置,但不会为您拆分字符串 - strtok 会这样做,这使得它在这里更有用。
【解决方案2】:

一些语言提供了一个字符串函数 split ,它接受一个字符串或正则表达式并将字符串拆分为一个由分隔符分隔的子字符串列表(python、ruby、perl)。构造这样的分割函数并不太难,尤其是如果你只是在单个字符上分割。

char** split(char* string, char delim);

您还需要一个字符串连接函数和一个清理分配空间的函数。

char* split_join(char** splitray, char* buffer);
void split_free(char** splitray);

【讨论】:

  • 分割函数不就是strtok吗?
  • 阅读 python 中的拆分。 strtok 将字符串分成两部分(破坏性地)。
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多