C++ 使用C++;strstr函数删除正在搜索的部分子字符串
我在课堂上有一个练习题让我难倒了,那就是写一个名为strct的函数,它接收两个C风格的字符串参数s和pattern。如果模式字符串包含在s中,则函数将进行修改,以便从s中删除出现在s中的第一个模式。要执行模式搜索,请使用预定义的strstr函数 这是我现在的代码C++ 使用C++;strstr函数删除正在搜索的部分子字符串,c++,function,strcpy,strcat,strstr,C++,Function,Strcpy,Strcat,Strstr,我在课堂上有一个练习题让我难倒了,那就是写一个名为strct的函数,它接收两个C风格的字符串参数s和pattern。如果模式字符串包含在s中,则函数将进行修改,以便从s中删除出现在s中的第一个模式。要执行模式搜索,请使用预定义的strstr函数 这是我现在的代码 void strCut(char *s, char *pattern) { char *x; char *y; x = strstr(s, pattern); cout << x; // testing wh
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');
void strct(字符*s,字符*pattern)
{
char*x;
char*y;
x=strstr(s,模式);
cout函数可以用以下方法编写
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
而不是内环。因为这似乎是作业,我只想给出一个提示:strstr
完成了一半的工作。剩余的工作将由memmove
完成。(看起来memcpy
或strcpy
也可以完成这一部分,但这是不正确的。)您还需要strlen
-1strcpy
对于重叠字符串有未定义的行为。如果对家庭作业给出完整答案,将再次使用-1(这已被科学证明会抑制学习),和-1第三次,如果我能做到的话,这是在括号内加空格的可恶做法。C11第7.24.2.3节(strcpy
规范):“如果复制发生在重叠的对象之间,行为是未定义的。”memcpy
、strncpy
、strcat
、strncat
的相同语言。只有memmove
对该用例有效。如果您承认错误,请更正代码,以免误导未来的读者。(不过,我不会撤回-1,因为它给出了家庭作业的完整答案。)@Zack我可以手动编写代码,实际上与strcpy的逻辑相同。@Zack你是说第一个函数定义吗?