2012-04-15 43 views
0

如何找到str中第一個unescaped char。在下面的代碼,我得到第14位的第一個字符,但我正在尋找在位置一個26首次發生除C中的轉義字符以外

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

int main() 
{ 
    char str[] = "FOO + pHWAx \\\"bar AER/2.1\" BAZ"; 
    printf ("%s\n",str); 
    char * pch; 
    pch=strchr(str,'"'); 
    printf ("found at %d\n",pch-str+1); 
    return 0; 
} 
+0

任何機會,這不會發生作業,它是必需的'strchr'必須使用? – Kaz 2012-04-15 05:56:25

+0

@Kaz:謝謝!不,我只是認爲'strchr'會在大字符串中表現更好。 – Kayla 2012-04-15 06:15:26

回答

0

使用strpbrk功能來尋找幾個大字任何一個的一次首次出現。你不能跳過轉義字符;你必須檢查它是否跟着你真正想要的角色。

I.e.假設我們想要尋找",可以將其轉義爲\"。其實,這意味着我們必須尋找"\。換句話說:

char *ptr = strpbrk(string, "\"\\"); /* look for chars in the set { ", \ } */ 

但是,我們不得不這樣做在一個循環中,因爲我們是在轉義引號不感興趣,一直走下去:

char *quote = 0; 
char *string = str; /* initially points to the str array */ 

while (*string != 0) { 
    char *ptr = strpbrk(string, "\"\\"); 

接下來我們檢查是否發現了一些:

if (!ptr) 
    break; 

如果我們發現某事必然是一個\"

if (*ptr == '"') { 
    quote = ptr; 
    break; 
    } 

如果它不是一個引號,那麼它一定是一個轉義。我們增加到下一個角色。如果它是一個終止空值,那意味着我們在一個字符串的末尾有一個反斜槓:一個不正確的轉義。

if (*++ptr == 0) 
    break; 

否則,我們可以跳過下一個字符並繼續循環掃描下一個轉義或未轉義的引用。

string = ++ptr; 
} 

如果發生轉義報價,然後quote指向它while循環執行後。否則quote保持爲空。

此代碼假設除\"之外還存在其他轉義,但它們都是一個字符長,例如, \b\r。如果有更長的轉義,如\xff,它將不起作用。轉義構成語言的慣例:您必須知道您正在處理的語言是否正確。

+2

瑣事:術語「break」('strpbrk',中斷指針)和「span」('strspn','strcspn')來自文本處理語言SNOBOL中的模式函數BREAK和SPAN。 – Kaz 2012-04-15 05:40:10

+0

不會'string = ++ ptr;'需要'string = ptr + 2;'所以它跳過報價? – Kayla 2012-04-15 16:51:50

+0

對不起,這是越野車。我會修好它。 – Kaz 2012-04-15 22:31:46