如何使用指针来判断一个 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)
因此,对于我的作业,我必须完成函数 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)