2014-03-26 37 views
0

我有一個練習題在我有難以置信的是寫一個名爲strCut的函數接收兩個C風格的字符串參數s和模式。如果模式字符串包含在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還是第三次用於將空間放在括號內的可惡練習。 – zwol

+1

C11第7.24.2.3節(strcpy'的規範):「如果在重疊的對象之間進行復制,*行爲是未定義的*。」 'memcpy','strncpy','strcat','strncat'完全相同的語言。這個用例中只有'memmove'是有效的。 – zwol

+0

@Zack我很抱歉。看起來你是對的, –