C++ 使用C++;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

我在课堂上有一个练习题让我难倒了,那就是写一个名为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 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
-1
strcpy
对于重叠字符串有未定义的行为。如果对家庭作业给出完整答案,将再次使用-1(这已被科学证明会抑制学习),和-1第三次,如果我能做到的话,这是在括号内加空格的可恶做法。C11第7.24.2.3节(strcpy
规范):“如果复制发生在重叠的对象之间,行为是未定义的。”
memcpy
strncpy
strcat
strncat
的相同语言。只有
memmove
对该用例有效。如果您承认错误,请更正代码,以免误导未来的读者。(不过,我不会撤回-1,因为它给出了家庭作业的完整答案。)@Zack我可以手动编写代码,实际上与strcpy的逻辑相同。@Zack你是说第一个函数定义吗?