C++ 如何使用指针确定一个c字符串是否以另一个c字符串结尾?

C++ 如何使用指针确定一个c字符串是否以另一个c字符串结尾?,c++,c-strings,C++,C Strings,因此,对于我的赋值,我必须完成函数endsWith,如果s1以s2结尾(两个cstring),它将返回true 示例:“帆船”、“船”->正确 例如:“密西西比”,“馅饼”->假 我已经成功地完成了startsWith程序,如果s1从s2开始,它将返回true bool startsWith(const char* s1, const char* s2) { // enter code under here while (*s1) { auto *p1 = s1,

因此,对于我的赋值,我必须完成函数endsWith,如果s1以s2结尾(两个cstring),它将返回true

示例:“帆船”、“船”->正确 例如:“密西西比”,“馅饼”->假

我已经成功地完成了startsWith程序,如果s1从s2开始,它将返回true

bool startsWith(const char* s1, const char* s2)
{
   // enter code under here
   while (*s1)
   {
      auto *p1 = s1, *p2 = s2;
      while (*p1 && *p2 && *p1 == *p2)
      {
         p1++;
         p2++;
      }
      if (*p2 == '\0') {return true;}
      else {return false;}
   }
   // enter code above this line
}
这是我的教授说的用于查找角色最后一次出现的程序:

int find(const char a[], char target)
{
   int result = -1;
   for (int i = 0; a[i] != '\0'; ++i)
      if (a[i] == target)
         result = i;
   return result;
}
但我正在努力寻找一种方法,将两者连接起来,以使endsWith。我所有的尝试都以错误告终。我将是第一个承认我不知道指针到底是什么或如何使用它们或它们的目的是什么的人,而第一个指针的通过纯属运气

这是我最近一次没有指针的失败尝试,它通过了9次测试中的5次:

#include <cstring>
using namespace std;
bool endsWith(const char* s1, const char* s2)
{
   int len1 = strlen(s1);
   int len2 = strlen(s2);
   // enter code under here

 if (len2 > len1) {return false;}
   for (size_t i = 0; i < len1; ++i)
   {
      if(s1[len1 - i - 1] != s2[len2 - i - 1]) {return false;}
   }
   return true;

   // enter code above here
}

<>你把你的问题标记为C++,但是你的代码在技术上暗示“C”,这对我来说很好。 “C”解决方案


下面是我如何在中解决它的:

bool以(字符串第一,字符串第二)结尾{
if(second.size()>first.size())
返回false;
返回first.substr(first.size()-second.size())==second;
}

我知道你想自己写练习

但是,如果您需要在现实世界的代码中执行此操作,这里有一行代码:(需要C++20)


@选择
constcharstring&
是什么意思?具体来说,
char
是什么意思?哎呀。。打字错误我的意思是说常量字符串&。大脑放屁。我将删除并重复。更正的注释:您应该将这些字符串作为
常量字符串&
而不是
字符串
传递到函数中-避免复制并启用优化。此外,还允许调用方传递字符串文本和
char*
实例,而无需太多开销。啊!抱歉搞混了。我们正在学习如何用C++编写C代码。还是C++程序中的C代码?这是一个C++课程,谢谢!我不得不稍微修改一下,但最终还是成功了@米歇尔-如果你觉得答案有用,别忘了投票/接受。你需要编辑的“微小的一点”是什么?我只需要切换len1和len2的值,它没有什么大的!如果你想看的话,我把工作代码放在问题的末尾。再次谢谢你^^
if (len2 > len1) {return false;}
   size_t offset = len1 - len2;
   s1 += offset;
   return (strcmp(s1, s2) == 0);
// returns true if "s2" ends with "s1"
// examples s1="World" and s2="Hello World" => returns true
// examples s1="Hello" and s2="Hello World" => returns false
bool endsWith(const char* s1, const char* s2)
{
    size_t len1 = strlen(s1);
    size_t len2 = strlen(s2);

    // if s1 is longer than s2, then we can trivially reject it
    if (len1 > len2)
    {
        return false;
    }

    size_t offset = len2 - len1;
    s2 += offset;
    return (strcmp(s1, s2) == 0);
   
}
std::string_view(s1).ends_with(s2)