【问题标题】:Get the beginning of a string until a given char获取字符串的开头直到给定的字符
【发布时间】:2018-01-31 14:46:40
【问题描述】:

我知道这是一个简单的问题,但我找不到答案。

我有这个字符串:

"M1[r2][r3]"

我只想得到"M1",我正在寻找类似strchr() 的东西 一个获取字符串和char 的函数。

【问题讨论】:

标签: c


【解决方案1】:

使用strtok"[" 作为分隔符怎么样?

#include <string.h> /* for strtok */
#include <stdio.h>  /* for printf */
int main()
{
    char str[] = "M1[r2][r3]"; // str will be modified by strtok
    const char deli[] = "[";   // deli could also be declared as [2] or as const char *. Take your pick...
    char *token;

    token = strtok(str, deli); // can also call strtok(str, "["); and not use variable deli at all
    printf("%s", token);       // printf("%s", str); will print the same result

    /* OUTPUT: M1 */

    return 0;    
}

【讨论】:

  • 您应该提到strtok() 更改了输入缓冲区,以便打印str 也将是"M1",因为每个分隔符都将被一个空终止符替换。此外,不需要[2],只需使用[]
  • 我同意[] 可以,但为什么不使用[2]?我认为它是一个提醒(尤其是对于初学者),“[”是一个字符串文字,有 2 个 char
  • @ClsForCookies:啊,我没这么看:D。我只是在想不要重复自己。
  • 我希望我没有越界,但根据我的经验,当我在 SO 做我的第一步时,这些是对我最有帮助的答案。我必须了解新功能以及其他人如何实现我的问题目标。如果这里的 OP 不是菜鸟,我的答案会有所不同
  • @CIsForCookies 不错的答案,+1,但请包含所需的标题,有些用户可能不知道它们(尽管他们可以在参考中看到它,但是......)。
【解决方案2】:

使用strtok() 和要停止的字符(分隔符,在您的情况下为[),如下所示:

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="M1[r2][r3]";
  printf ("Getting M1 from \"%s\":\n",str);
  strtok (str,"[");
  if (str != NULL)
    printf ("%s\n",str);
  return 0;
}

输出:

Getting M1 from "M1[r2][r3]":
M1

但是,如果您知道子字符串的长度,您应该会看到Get a substring of a char*

【讨论】:

    【解决方案3】:

    类似 strchr() 的函数可以获取字符串和字符以停止。

    如果只需要打印子字符串,请使用strcspn(),它会在'[' 第一次出现时找到偏移量,(或者如果没有找到则结束)。这不会改变源字符串。

    const char *s = "M1[r2][r3]";
    printf("%.*s\n", strcspn(s, "["), s);
    

    输出

    M1
    

    【讨论】:

      【解决方案4】:

      像这样使用sscanf()

      char subStr[3];
      sscanf("M1[r2][r3]", " %2[^[]", subStr);
      

      其中[^[] 表示除[ 之外的字符,2 保护写入子字符串的字符串的长度(它等于subStr 的大小 - 1,因此 NULL 终止符的空间可用)。

      正如 BLUEPIXY 建议的那样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        • 1970-01-01
        • 2016-12-04
        • 2010-10-05
        • 1970-01-01
        • 2020-06-25
        • 2019-03-20
        相关资源
        最近更新 更多