如何使用指针来判断一个 c-string 是否以另一个 c-string 结尾?

How to use pointers to figure out if a c-string ends with another c-string?

因此,对于我的作业,我必须完成函数 endsWith,如果 s1 以 s2 结尾(两个 cstrings),returns true

示例:“帆船”、“船”-> 真 示例:“密西西比”、“馅饼”-> false

我已经成功地完成了程序 startsWith,returns 如果 s1 以 s2 开头则为真

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 == '[=12=]') {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] != '[=13=]'; ++i)
      if (a[i] == target)
         result = i;
   return result;
}

但我正在努力寻找一种将两者联系起来以达到目的的方法。我所有的尝试都以错误结束。我将首先承认我不知道指针到底是什么、如何使用它们或它们的目的是什么,纯属运气,第一个通过。

这是我最近一次没有指针的失败尝试,它通过了 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
}

编辑:这是有效的代码:

if (len2 > len1) {return false;}
   size_t offset = len1 - len2;
   s1 += offset;
   return (strcmp(s1, s2) == 0);

你将你的问题标记为 C++,但你的代码在技术上建议使用“C”,这对我来说没问题。

“C”解决方案

// 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);
   
}

以下是我在 my C++ project 中的解决方法:

bool ends_with(string first, string second) {
  if (second.size() > first.size())
    return false;
  return first.substr(first.size() - second.size()) == second;
}

我知道你想自己写练习。

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

std::string_view(s1).ends_with(s2)