2012-04-15 5 views
0

str에서 첫 번째 unescaped char을 어떻게 찾을 수 있습니까? 다음 코드에서, 나는 위치 (14)의 첫 번째 문자를 얻을,하지만 난 26C에서 이스케이프 된 문자를 제외하고 첫 번째 발생

#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

+0

@ 카즈 : 감사합니다! 아니, 그냥 strchr이 큰 문자열로 더 잘 수행 할 것이라고 생각했습니다. – Kayla

답변

0

는 한 번에 여러 문자 중 어느 하나를 선두를 찾기 위해 strpbrk 기능을 사용하여 위치에 하나를 찾고 있어요 . 이스케이프 문자를 건너 뛰어서는 안됩니다. 당신은 당신이 정말로 찾고있는 캐릭터가 뒤따라 지는지 확인해야합니다.

e.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; 
    } 

견적이 아닌 경우 이스케이프 여야합니다. 우리는 다음 문자로 증가합니다. 종료 null의 경우는, 캐릭터 라인의 마지막에 백 슬레시가있는 것을 의미합니다. 이것은 부적당 한 탈출입니다.

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

그렇지 않으면, 우리가 다음 문자를 건너 뛰고 다음 이스케이프 또는 이스케이프 견적을 스캔 루프를 계속할 수 있습니다. while 루프 실행 후 그것을

string = ++ptr; 
} 

이스케이프 견적이 발생하면

다음 quote 포인트. 그렇지 않으면 quote은 null로 유지됩니다.

이 코드는 \" 이외의 다른 이스케이프가 있다고 가정하지만 길이는 모두 한 문자입니다 (예 : \b 또는 \r. \xff과 같은 더 이상 이스케이프가 있으면 작동하지 않습니다. 탈출은 언어의 관습을 구성합니다. 올바르게 처리하기 위해 처리중인 언어가 무엇인지 알아야합니다.

+2

퀴즈 : "break"('strpbrk', 중단 포인터)와'span '('strspn','strcspn') 용어는 텍스트 처리 언어 SNOBOL의 패턴 함수 BREAK와 SPAN에서옵니다. – Kaz

+0

'string = ++ ptr;'은'string = ptr + 2;'일 필요가 없으므로 인용문을 건너 뛰는가? – Kayla

+0

예. 죄송합니다. 버그입니다. 나는 고칠 것이다. – Kaz