如何找到几个字符之一的第一个出现(除了使用正则表达式)

ssk*_*itk 4 c regex strstr

通过一堆线程去后,我知道我需要使用regex.h使用在C&C++的正则表达式.

但我想知道,是否有更简单的方法来搜索字符串中"/"或"\"的出现.

// I have a strstr statement like this -
str = strstr(s, "/");
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以更改它,以便我可以搜索第一次出现 / \在一次调用strstr.

Mar*_*nen 8

试试strcspn:

获取span直到字符串中的字符
扫描str1中第一次出现的任何字符是str2的一部分,返回在第一次出现之前读取的str1的字符数.

搜索包括终止空字符.因此,如果str1中没有找到str2的字符,则该函数将返回str1的长度.

例:

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

const char* findany(const char* s, const char* keys)
{
    const char* tmp;
    tmp = s + strcspn(s,keys);
    return *tmp == '\0' ? NULL : tmp;
}

int main ()
{
  char str1[] = "abc\\123";
  char str2[] = "abc/123";
  char str3[] = "abc123";
  char keys[] = "/\\";
  printf("1: %s\n",findany(str1,keys));
  printf("2: %s\n",findany(str2,keys));
  printf("3: %s\n",findany(str3,keys));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:strpbrk做与findany上面相同的事情.没看到那个功能:

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

int main ()
{
  char str1[] = "abc\\123";
  char str2[] = "abc/123";
  char str3[] = "abc123";
  char keys[] = "/\\";
  printf("1: %s\n",strpbrk(str1,keys));
  printf("2: %s\n",strpbrk(str2,keys));
  printf("3: %s\n",strpbrk(str3,keys));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出(两者):

1: \123
2: /123
3: (null)
Run Code Online (Sandbox Code Playgroud)

  • 或者使用`strpbrk`,它做了几乎相同的事情,但返回一个指针. (2认同)