2012-10-11 23 views
3

經歷了一堆線程後,我知道我需要使用regex.h在C++中使用正則表達式。如何找到第一次出現的幾個字符之一(除了使用正則表達式)

但我想知道,是否有更簡單的方法來搜索字符串中「/」或「\」的出現。

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

我想知道是否有可能改變它,這樣我可以在一個單一的呼叫搜索的strstr爲 /\的第一次出現。

+0

雖然它不完全用於這一目的,你可以使用'strtok_r'找到指定的一組角色的其中之一的第一次出現。 –

回答

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) 
+0

作爲多字節字符安全的首選解決方案:+1 – alk

+2

或者使用'strpbrk',它可以做幾乎相同的事情,但會返回一個指針。 – interjay

+0

@interjay,沒有看到那一個。這更好...更新。 –

0

你可以嘗試使用strchr函數找到一個字符中第一次出現:

pos_of_first_slash=strchr(s, '/'); 

返回指向字符在C字符串str中第一次出現。

終止空字符被認爲是C字符串的一部分。因此,它也可以被定位以檢索指向字符串結尾的指針。

返回一個指向str中第一次出現的字符的指針。如果找不到該字符,則該函數返回一個空指針。

+2

你可以,但問題是關於找到兩個字符之一。 – interjay

+0

請參閱編輯,@interjay。如果它是一個/或者,我會編輯這個問題會更加清楚。 – Richard

+1

好的,但如果其中一個搜索返回NULL,這不起作用。當已經有標準功能來完成這個確切的任務時,重新發明輪子是毫無意義的。 – interjay

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)是第一個。

相關問題