2014-06-20 2 views
2

하위 문자열을 찾는 함수를 작성하고 있습니다. 그러나 내가 어디로 잘못 가고 있는지 확실하지 않습니다. GDB를 실행하면 세그먼트 화 오류가 발생합니다. 누군가가 나를 올바른 방향으로 안내 할 수 있다면. (S2)는 null을 반환하는 S1의 문자열이 아닌 한 다음 세그먼트 오류를 ​​제공하는, 그것을 인쇄 할 때문자열에서 하위 문자열 찾기

여기에 코드

char *mystrstr(char * s1, const char * s2) 



int main(){ 
    char *s1 = "The quick brown fox jumps over the hell lazy dog"; 
    char *s2 = "hello"; 
    char *s4; 
    s4 = mystrstr(s1,s2); 
    printf("%s\n",s4); <--- this is where i am Seg. Faulting 



    return 0; 
} 
+2

null이 반환되지 않았습니까? – KRUKUSA

+0

@KRUKUSA. 나는 그것에 대해 확신한다고 생각한다. – Maddy

+0

'mystrlen'이란 무엇입니까? – Gluttton

답변

5

입니다. 이 같은

시도 뭔가 : 당신이 *s1에서 hello을 찾을 수 없기 때문에

s4 = mystrstr(s1,s2); 
if(s4 != NULL) 
    printf("%s\n",s4); 
1
printf("%s\n",s4? s4 : "(NULL)"); 
+0

+1. J0rge는 근본 원인을 해결하는 좋은 솔루션을 이미 제공했습니다. 이 솔루션을 사용하면 문자열이 있는지 여부에 관계없이 무언가를 인쇄 할 수 있습니다. – FoggyDay

0
char *s1 = "The quick brown fox jumps over the hell lazy dog"; 
char *s2 = "hello"; 

mystrstr*s2에 따르면 *s1의 문자열이 아니다. 따라서이 메서드는 NULL을 반환합니다. 문자열로 NULL을 인쇄 할 수 없으므로 오류가 발생합니다.

것은이를 확인하려면에 의해 *s1를 교체하려고 :

char *s1 = "The quick brown fox jumps over the hello lazy dog"; // replace hell by hello 

출력 될 것입니다 :

The quick brown fox jumps over the hello lazy dog 
2

문제는 내부 루프에서 당신이 s1에 액세스하기 위해 인덱스 i+j을 추가 할 것입니다. 귀하의 예에서 "dog"의 "o"를 가리키는 i을 상상한다면 j은 내부 루프에서 0에서 5 ("hello"길이)로 이동합니다. 이로 인해 s1[i+j]에 액세스하면 o, g, \0, 쓰레기, 쓰레기을 볼 수 있습니다.

C 문자열의 이점은 Null로 끝나는 것입니다. 따라서 문자열을 반복 할 수 있습니다.

for (char* i = s1; *i != 0; i++) { 
    ... 
} 

s1의 시작 부분부터 끝까지 0 바이트를 찾을 때까지 반복합니다. 내부 루프에서 다음을 쓸 수 있습니다.

const char *j, *k; 
for (j = s2, k = i; *j == *k && *j != 0; j++, k++); 
if (*j == 0) 
    return i; 

js2의 시작 부분에서 시작하여 k이 시작됩니다. i이 현재 s1을 가리키고 있습니다. 두 문자열이 같고 두 바이트가 끝나는 0 바이트에 도달하지 않은 한 반복합니다. 실제로 s2 (*j == 0)의 0 바이트에 도달하면 부분 문자열을 찾았습니다.

s1 대신 i을 반환해야합니다. 요청 된 부분 문자열이 시작되는 s1에 대한 포인터를 제공하기 때문입니다.

+0

J0rge가 올바르게 지적 했으므로 코드와 관련하여 다른 문제가 발생했습니다 : 즉, * printf *에 NULL을 전달했습니다. 그러나 위의 요지는 여전히 유효하며 CPU의 메모리 관리 장치에 의해 보호되는 메모리 영역으로 문자열을 읽는 경우에 대비하여 불쾌한 충돌을 일으 킵니다. – Fabian

관련 문제