在经历了一堆线程之后,我知道我需要使用 regex.h 在 C & C++ 中使用正则表达式。
但我想知道,有没有更简单的方法来搜索字符串中出现的“/”或“\”。
// I have a strstr statement like this -
str = strstr(s, "/");
我想知道是否可以更改它,以便我可以在对 strstr 的单个调用中搜索 a
/
或的第一次出现。 \
尝试strcspn:
Get span until character in string
扫描 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)
有一个 C 函数可以做到这一点 - strpbrk()
我想知道是否可以更改它,以便我可以在一次调用 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)。
您可以尝试使用 strchr 函数来查找第一次出现的字符:
pos_of_first_slash=strchr(s, '/');
返回指向 C 字符串 str 中第一次出现的字符的指针。
终止的空字符被认为是 C 字符串的一部分。因此,也可以定位它以检索指向字符串末尾的指针。
返回指向 str 中第一次出现的字符的指针。如果未找到该字符,则该函数返回一个空指针。