2014-03-26 5 views
0

나는 두 가지 C 스타일 문자열 매개 변수 s 및 pattern을받는 strCut이라는 함수를 작성하는 저주받은 클래스에서 연습 문제를 가지고 있습니다. 패턴 문자열이 s에 포함되면 함수는 s에 나타나는 패턴의 첫 번째 항목이 s에서 제거되도록 s를 수정합니다. 패턴 검색을 수행하려면 미리 정의 된 strstr 함수를 사용하십시오.C++ strstr 함수를 사용하여 검색하려는 하위 문자열의 부분을 제거하십시오.

내 코드는 다음과 같습니다.

void strCut(char *s, char *pattern) 
{ 
    char *x; 
    char *y; 
    x = strstr(s, pattern); 
    cout << x; // testing what x returns 
} 

int main() 
{ 

    char s[100];  // the string to be searched 
    char pattern[100]; // the pattern string 
    char response;   // the user's response (y/n) 

do 
{ 
    cout << "\nEnter the string to be searched ==> "; 
    cin.getline(s, 100); 
    cout << "Enter the pattern ==> "; 
    cin.getline(pattern, 100); 
    strCut(s, pattern); 
    cout << "\nThe cut string is \"" << s << '"' << endl; 
    cout << "\nDo you want to continue (y/n)? "; 
    cin >> response; 
    cin.get(); 
} while (toupper(response) == 'Y'); 

도움이 매우 감사합니다. 감사합니다

+0

숙제 인 것 같기 때문에 나는 단지 힌트를 줄 것이다.'strstr'은 절반의 일을한다. 나머지 작업은'memmove '에 의해 수행됩니다. ('memcpy' 나'strcpy'도 그 부분을 할 수있는 것처럼 보일지 모르지만 그것은 틀립니다.)'strlen'도 필요할 것입니다. – zwol

답변

0

기능은 예를 들어 다음과 같은 방법으로

char * strCut(char *s, const char *pattern) 
{ 
    if (char *p = std::strstr(s, pattern)) 
    { 
     char *q = p + std::strlen(pattern); 
     while (*p++ = *q++); 
    } 

    return s; 
} 

을 쓸 수 또는 기능 std::memmove 대신 내부 루프가 사용될 수있다.

+0

-1'strcpy'는 중복 문자열에 대해 정의되지 않은 동작을합니다. 숙제에 대한 완전한 답을 제공하기 위해 -1을 다시 시도 할 것입니다. (이것은 과학적으로 학습을 방해하는 것으로 나타났습니다.) 그리고 오직 한 번만, 괄호 안쪽에 공백을 넣는 가증스러운 연습을위한 -1 세 번. – zwol

+1

C11 섹션 7.24.2.3 ('strcpy'의 명세) : "복사가 겹치는 객체 사이에서 발생하면 * 동작은 정의되지 않습니다 *." 'memcpy','strncpy','strcat','strncat'과 같은 언어. 이 유스 케이스에는'memmove' 만 유효합니다. – zwol

+0

@Zack 미안합니다. 그것은 당신이 옳다는 것입니다, –