如何在 C++ 中检查字符串的开头

     2023-02-22     55

关键词:

【中文标题】如何在 C++ 中检查字符串的开头【英文标题】:how to check string start in C++ 【发布时间】:2011-11-11 14:06:21 【问题描述】:

在 C++ 中有什么方法可以检查字符串是否以某个字符串开头(小于原始字符串)?就像我们在 Java 中可以做的那样

bigString.startswith(smallString);

【问题讨论】:

你说的是C字符串还是std::String 我说的是 C++ string.std::string 【参考方案1】:
std::string s("Hello world");

if (s.find("Hello") == 0)

    std::cout << "String starts with Hello\n";

【讨论】:

我认为正则表达式对于这种简单的检查来说是一个糟糕的选择,请参阅我的回答,了解我认为这是解决此问题的有效方法。或者更好的 Alan Stokes 回复 string::compare()。 一个有效的解决方案应该是O(min(bigString.length(), smallString.length())) @sufyansiddique 很简单,是的。有效,不是很有效。如果smallString 不长于bigString,则只需比较前smallString.size() 个字符即可知道答案;除了在初始位置之外,您不必搜索整个 bigString 以查找 smallString 正如其他人评论的那样,如果您要搜索的字符串很长并且您要查找的字符串很短,这不是一个非常有效的想法。当您只对开头的位感兴趣时,为什么要遍历整个字符串? 如果“Hello”出现在最后还是中间怎么办?我认为这个程序应该找到任何出现的特定子字符串,而不是“以”开头。我认为提升字符串算法是一个不错的选择。参考***.com/questions/1878001/…【参考方案2】:

您可以使用string::compare() 执行此操作,它提供了用于比较两个字符串的全部或部分的各种选项。此版本将smallStringbigString 的适当大小前缀进行比较(如果bigStringsmallString 短,则可以正常工作):

bigString.compare(0, smallString.length(), smallString) == 0

我倾向于将其封装在一个名为 startsWith() 的免费函数中,否则它看起来会有点神秘。

更新:C++20 is adding 新增 starts_withends_with 函数,因此您最终将能够只编写 bigString.starts_with(smallString)

【讨论】:

【参考方案3】:

使用string::find()string::substr() 的方法不是最优的,因为它们要么复制你的字符串,要么在字符串的开头搜索多个匹配项。在您的情况下,这可能不是问题,但如果是,您可以使用 std::equal 算法。记得检查“干草堆”至少和“针”一样长。

#include <string>    

using namespace std;

bool startsWith(const string& haystack, const string& needle) 
    return needle.length() <= haystack.length() 
        && equal(needle.begin(), needle.end(), haystack.begin());

【讨论】:

【参考方案4】:

一如既往,正确的解决方案来自 Boost:boost::algorithm::starts_with

【讨论】:

为了完成这个简单的任务而使用 boost 太糟糕了。 @Borzh,当然,你已经在你的项目中大量使用 Boost,为什么不这样做呢? 不是每个人都使用 boost。下载它,把它放在存储库中只是为了使用starts_with()有点夸张。也许你应该考虑删除“正确的解决方案,一如既往......”。它既不是“正确”也不是“总是”。 我和阿瓦卡在一起。在我看来,这正确的解决方案。顺便说一句,你必须包括 boost/algorithm/string.hpp 同意 Borzh。并非所有项目都使用 boost(远非如此),因此“总是”和“正确”的词不属于这里。将这种怪物添加到 STL 或简单 strcmp 可以工作的项目中是疯狂的。【参考方案5】:

稍微优化一下:

if ( smallString.size() <= bigString.size() &&
     strncmp( smallString.c_str(), bigString.c_str(), smallString.length() ) == 0 )

别忘了#include &lt;cstring&gt;#include &lt;string.h&gt;

【讨论】:

【参考方案6】:

对于 C++20,您可以使用 std::basic_string::starts_with(或 std::basic_string_view::starts_with):

#include <string_view>

std::string_view bigString_v("Winter is gone"); // std::string_view avoids the copy in substr below.
std::string_view smallString_v("Winter");
if (bigString_v.starts_with(smallString_v))

    std::cout << "Westeros" << bigString_v.substr(smallString_v.size());

【讨论】:

【参考方案7】:

最简单的方法是:

if ( smallString.size() <= bigString.size()
    && std::equals( smallString.begin(), smallString.end(), bigString.end() )

(如果两者之一或两者都是向量,这也将起作用。或任何 其他标准容器类型。)

【讨论】:

-1 1) 我找不到任何 std::equals。你的意思是 std::equal 吗? 2) 你确定使用 bigString.end() - 人们会期待 bigString.begin() 吗? 3) Kleist 之前发布的答案似乎完全正确 是的,两者都是。是std::equal,应该是bigString.end()【参考方案8】:

strstr() 返回指向字符串中第一次出现的字符串的指针。

【讨论】:

【参考方案9】:

我认为发布一个不使用任何库函数的原始解决方案是有意义的......

// Checks whether `str' starts with `start'
bool startsWith(const std::string& str, const std::string& start) 
    if (&start == &str) return true; // str and start are the same string
    if (start.length() > str.length()) return false;
    for (size_t i = 0; i < start.length(); ++i) 
        if (start[i] != str[i]) return false;
    
    return true;

添加一个简单的std::tolower 我们可以使这个不区分大小写

// Checks whether `str' starts with `start' ignoring case
bool startsWithIgnoreCase(const std::string& str, const std::string& start) 
    if (&start == &str) return true; // str and start are the same string
    if (start.length() > str.length()) return false;
    for (size_t i = 0; i < start.length(); ++i) 
        if (std::tolower(start[i]) != std::tolower(str[i])) return false;
    
    return true;

【讨论】:

【参考方案10】:

要么创建一个子字符串,它是您的smallString 变量的长度,然后比较两者。或者搜索子字符串smallString,看看它是否返回索引0

【讨论】:

【参考方案11】:

http://www.cplusplus.com/reference/string/string/substr/

您可以使用 string.substr() 从任何位置查看任意数量的字符,也可以使用 string.find() 成员。

【讨论】:

如何在 C++ 的条件语句中检查变量类型?

...-2506:38:49【问题描述】:我对c++很陌生,当为变量cont输入字符串并回答时,我试图让我的程序退出循环时遇到问题。在python中,做简单的检查很容易,但我不确定我应该在cpp中做什么。我尝试使用if(typeid(answer))==t 查看详情

如何在 C++ 中将字符串转换为 int?

】如何在C++中将字符串转换为int?【英文标题】:Howtoconvertstringtointinc++?【发布时间】:2016-08-1201:20:48【问题描述】:我正在创建一个电话注册程序来检查输入的电话号码是否有效。我曾多次尝试搜索谷歌,并弄清楚如何检查电... 查看详情

如何在 Swift 中检查字符串以(前缀)开头或以(后缀)结尾

】如何在Swift中检查字符串以(前缀)开头或以(后缀)结尾【英文标题】:HowtocheckwhataStringstartswith(prefix)orendswith(suffix)inSwift【发布时间】:2015-10-0610:18:04【问题描述】:我正在尝试测试Swift字符串是否以某个值开头或结尾。这... 查看详情

如何在c中检查十六进制数(%x)是否以某个数字开头?(代码片段)

...否以3开头,使用C.目前我的想法是将该十六进制数转换为字符串并检查初始字符,但无法找到任何文档来执行此操作。有人有什么想法吗?也许只是一个暗示。答案有很多方法可以将数字转换为十六进制字符串(sprintf浮现在脑... 查看详情

检查字符串是不是以 XXXX 开头

】检查字符串是不是以XXXX开头【英文标题】:CheckingwhetherastringstartswithXXXX检查字符串是否以XXXX开头【发布时间】:2012-02-0620:09:54【问题描述】:我想知道如何在Python中检查字符串是否以“hello”开头。在Bash中我通常这样做:if[[... 查看详情

如何使用forAll检查数组中的所有字符串是不是以大写字母开头?

】如何使用forAll检查数组中的所有字符串是不是以大写字母开头?【英文标题】:HowtocheckifallstringsinanarraystartwithuppercaseletterusingforAll?如何使用forAll检查数组中的所有字符串是否以大写字母开头?【发布时间】:2019-09-2522:01:55【... 查看详情

在 C++ 中使用正则表达式检查字符串

】在C++中使用正则表达式检查字符串【英文标题】:CheckingstringswithregexinC++【发布时间】:2012-06-2507:41:33【问题描述】:我将在C++应用程序中使用正则表达式,但我没有使用正则表达式的经验。我特别想检查一些字符串是否属于... 查看详情

如何检查字符串中的数据是不是是 C++ 上的数字?

】如何检查字符串中的数据是不是是C++上的数字?【英文标题】:HowcanIcheckifthedatainastringisanumberonC++?如何检查字符串中的数据是否是C++上的数字?【发布时间】:2020-04-2116:08:32【问题描述】:我是C++新手。如果用户输入具有不同... 查看详情

查找以某个字符串开头的文件[重复]

】查找以某个字符串开头的文件[重复]【英文标题】:findfilestartingwithacertainstring[duplicate]【发布时间】:2015-11-1002:14:32【问题描述】:我想知道如何检查文件是否存在:例如我有很多文件:Boba.txtJames.txtJamy.txtBoby.txt如何检查以Bob... 查看详情

如何检查语句字符串是不是包含 C++ 中的单词? [关闭]

】如何检查语句字符串是不是包含C++中的单词?[关闭]【英文标题】:HowtocheckifastatementstringcontainsawordinC++?[closed]如何检查语句字符串是否包含C++中的单词?[关闭]【发布时间】:2021-03-2211:22:03【问题描述】:我想在C++中检查语句... 查看详情

如何在 C 中检查我的 char 数组的前两个字符?

】如何在C中检查我的char数组的前两个字符?【英文标题】:HowdoIcheckthefirsttwocharactersofmychararrayinC?【发布时间】:2020-01-0919:03:02【问题描述】:这是在不使用任何C运行时库例程的情况下创建类似C库函数atoi()的代码。我目前正纠... 查看详情

如何修剪字符串的开头和结尾双引号?

】如何修剪字符串的开头和结尾双引号?【英文标题】:HowcanItrimbeginningandendingdoublequotesfromastring?【发布时间】:2011-02-0605:03:19【问题描述】:我想从字符串中剪掉开始和结束的双引号(")。我怎样才能在Java中实现这一点?谢谢!... 查看详情

如何在 C++ 中检查向量中的哪些对象

】如何在C++中检查向量中的哪些对象【英文标题】:HowtocheckwhichobjectsinvectorinC++【发布时间】:2018-03-1914:31:26【问题描述】:嗯,Hospital是具有患者向量的类。FemaleIn、FemaleOut、MaleIn、MaleOut是患者的派生类(基类)。这些类有toStr... 查看详情

在 windows 中,如何使用 c++ 检查端口是不是免费

】在windows中,如何使用c++检查端口是不是免费【英文标题】:inwindows,howtocheckportisfreeornotbyusingc++在windows中,如何使用c++检查端口是否免费【发布时间】:2014-09-1206:43:26【问题描述】:在windows中,如何使用c++检查端口是否空闲(... 查看详情

如何在 C++ 中检查无限和不确定的值?

】如何在C++中检查无限和不确定的值?【英文标题】:HowdoyoucheckforinfiniteandindeterminatevaluesinC++?【发布时间】:2010-09-2911:29:18【问题描述】:在我的程序中,当一个值被零除时,通常会出现无穷大。当我将零除以零时,我变得不... 查看详情

如何在 C++ 中检查二维数组中负值的输入验证?

】如何在C++中检查二维数组中负值的输入验证?【英文标题】:HowcanIcheckinputvalidationfornegativevaluesina2DarrayinC++?【发布时间】:2020-07-1317:05:51【问题描述】:这里只是一个简单的问题。我正在尝试检查输入验证的负值,我希望我的... 查看详情

如何检查单词是不是以给定字符开头?

】如何检查单词是不是以给定字符开头?【英文标题】:Howtocheckifawordstartswithagivencharacter?如何检查单词是否以给定字符开头?【发布时间】:2013-03-0918:06:08【问题描述】:我有一个Sharepoint项目的列表:每个项目都有一个标题、... 查看详情

如何在 C++ 中检查用户输入

】如何在C++中检查用户输入【英文标题】:Howtochecktheuserinputinc++【发布时间】:2019-09-2918:24:27【问题描述】:在下面的代码中,我试图在“SOMECLASS”类的public空间中创建一个函数,该函数将接受由浮点值组成的用户输入(在privat... 查看详情