2014-11-03 7 views
1

다른 작업을 수행하는 함수를 만드는 프로젝트에서 작업하고 있지만 함수 중 하나를 구현하는 데 문제가 있습니다.왜 내 캐릭터 기능이 충돌합니까?

int main() 
{ 
    char str1[30] = "Hello"; 
    char str2[30] = "Goodbye old friend"; 
    char str3[30]; 

    char *p = strCopy(str3, "Annie"); 
    printf("(Annie) %s\n", p); 

    p = strString(str3, "nn"); 
    printf("(nnie) %s\n", p); 

    strCopy(str3, "HeloHellooo"); 
    p = strString(str3, "ello"); 
    printf("(ellooo) %s\n", p); 

    return 0; 
} 

char *strCopy(char *s1, const char *s2) 
{ 

    char *b = s1; 

    while (*s2!='\0') 
    { 
     *s1 = *s2; 
     s1++; 
     s2++; 
    }  
    *s1 = '\0'; 

    return b; 

} 


char *strString(const char *s1, const char *s2) // returns a string that starts with the characters in *s2. For example: char *strString ("Annie", "nn") should return "nnie".) 
{ 
    char *test; 
    char *b = test; 
    while (*s1 != '\0' && *s2 != '\0') 
    { 

     if (*s1 == *s2) 
     { 
     *test = *s1; 
     } 
     s1++; 
     s2++; 
    } 

*test = '\0';  
return b; 
} 

나는 문제가 상수 정수는 두 개의 매개 변수가있을 때 문자 * strString에 값을 반환하는 방법을 알아내는 데 문제. 시도 할 때 프로그램이 충돌합니다. 매개 변수, 함수 선언 및 main() 내부의 내용은 작성된 그대로이어야합니다. 이 코드는 프로젝트의 일부로 나에게 주어졌다. 나는 함수 안에서 일어나는 일만 조작 할 수 있습니다. 나는 또한 내 함수에서 배열을 사용할 수 없다.

(내부 코드는 * strString 분명히 마지막이 아니다. 난 그냥 값을 반환하는 방법을 알아낼 수는 없지만 무엇이든을 테스트하는 데 문제가 있습니다.) strString 내부

+0

'strString'의 매개 변수는 정수가 아니라 포인터입니다. 그러나 "strstr"함수와 같은 동작을한다고 가정하면 함수 포인터를 다시 생성해야 실제로 포인터를 생성 할 수 있습니다. –

답변

2

당신이 초기화되지 않은 포인터를 사용 test :

:

char *b = test; // oops 

...

*test = *s1;  // oops 

당신과 함께 시작할 수

char *test = NULL; 

그런 다음 부분 문자열을 찾을 때 test을 업데이트 할 수 있습니다. 아무 단계에서든 *test =을 쓰고 싶습니다. 입력 문자열을 수정하거나 새 문자열을 만들지 않기 때문입니다. 하위 문자열을 찾을 수있는 지점에서 s1을 가리키는 포인터를 반환해야합니다.

+0

말이된다. 그러나 나는 그것을 빼앗아 시험을 보려고 할 때, 그것은 여전히 ​​충돌합니다. – Titanguy654

+0

그러나'test'는 아직 초기화되지 않았습니다. 그것을 초기화해야합니다. 정확히 무엇이되어야할까요? – smci

+0

'strString :: test'가 s1의 복사본을위한 버퍼 인 경우, 또는 일부는 * test에 쓰기를 시작하기 전에 malloc() 테스트가 필요합니다. – smci