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

时间:2012-10-11 18:10:46

标签: c regex strstr

经过一堆线程之后,我知道我需要使用regex.h来在C&中使用正则表达式。 C ++。

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

// I have a strstr statement like this -
str = strstr(s, "/");

我想知道是否可以更改它,以便我可以在一次调用strstr时搜索 / \的第一次出现。< / p>

4 个答案:

答案 0 :(得分:7)

尝试strcspn

  

获取范围直到字符串
  扫描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;
}

修改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;
}

两者的输出:

1: \123
2: /123
3: (null)

答案 1 :(得分:1)

  

我想知道是否可以更改它以便我可以搜索   在strstr

的单次调用中首次出现“/”或“\”

您可以使用strtok修改源字符串(或参见strtok_r)。或者您可以使用strcspn

The strcspn() function shall compute the length (in bytes) of the maximum
initial segment of the string pointed to  by  s1  which consists entirely
of bytes not from the string pointed to by s2.

所以

p = s + strcspn(s, "/\\");

将返回指向/,\或最终NUL字符的指针(如果找不到\或//)。

当然你也可以运行strchr两次,看看哪一个,如果不是NULL,是第一个。

答案 2 :(得分:1)

有一个C函数可以做到这一点 - strpbrk()

答案 3 :(得分:0)

您可以尝试使用strchr函数查找第一个出现的字符:

pos_of_first_slash=strchr(s, '/');

返回指向C字符串str。

中第一个字符出现的指针
  

终止空字符被视为C字符串的一部分。因此,也可以定位它以便检索指向字符串末尾的指针。

     

返回指向str中第一个字符出现的指针。如果未找到该字符,则该函数返回空指针。