【问题标题】:Understanding String::Find In C++理解 C++ 中的字符串::查找
【发布时间】:2020-07-25 05:44:26
【问题描述】:

我接到了一项编程任务,其中涉及删除字符串中的某些字母。当我找到公共成员函数字符串 find 时,我正在尝试不同的方法来做到这一点。简而言之,我正在通过这个程序测试该功能:

#include <iostream>
#include <string>
using namespace std;

int main()
{

  string Word = "Applejuice";
  
  cout<<Word.find("e")<<endl;






  return 0;


}

因此,当我输入诸如“e”之类的字母时,我得到了数字 4,这让我感到困惑,因为我认为该函数会计算该特定单词中的所有字母,例如苹果汁。此外,当我使用该单词中未使用的字母时,我会得到像 18446744073709551615 这样的数字,例如当我在上面的代码中输入 X 时。

有人能解释一下为什么会这样吗?

【问题讨论】:

  • find() 返回它找到的第一个匹配项的索引。因此,在您的情况下,它会返回"Apple" 中第一个'e' 的索引,即4(请记住,C++ 中的索引是从零开始的,因此'Apple' 中的'A' 的索引是0)。将来,请尝试阅读有关您使用的函数的文档,而不是假设您知道它们的作用 - 这次您的假设完全错误。
  • 那么我该如何做才能计算某个字母在一个单词中出现的次数?什么时候溢出?
  • find() 不计算找到它正在搜索的内容的次数。它只返回它找到的第一个索引(或string::npos,如果没有找到)。如果您想计算字符串出现的次数,find() - 至少就其本身而言 - 不是解决方案,因为它不计算。如果您想为此目的使用find(),则需要实现逻辑(例如重复调用find() 的循环)。
  • @Mactin "那么我该如何做才能计算某个字母在一个单词中出现的次数?" - 你可以使用std::count() .

标签: c++ string find


【解决方案1】:

string.find() 将返回第一个匹配的第一个字符的位置。 如果未找到匹配项,则该函数返回 string::npos

因此,您获得的号码 (18446744073709551615) 是 string::npos

如果您只想在字符串中搜索单个字符,可以使用以下代码

#include <iostream> 
#include <string> 
using namespace std; 
  
// Function that return count of the given  
// character in the string 
int count(string s, char c) 
{ 
    // Count variable 
    int res = 0; 
  
    for (int i=0;i<s.length();i++) 
  
        // checking character in string 
        if (s[i] == c) 
            res++; 
  
    return res; 
} 
  
// Driver code 
int main() 
{ 
    string str= "Applejuice"; 
    char c = 'e'; 
    cout << count(str, c) << endl; 
    return 0;
}

如果你想避免一些随机的大值作为输出,即string::npos,你可以像下面这样添加检查:

 if(Word.find("e") != string::npos)
 {
    ...
 }

【讨论】:

  • std::basic_string::npos 不是 nopos -- 最后一段错字/片段 -- (但我们知道你的意思 :)
  • 解释:npos其类型std::string::size_type的最大值,即std::size_t...
  • 无需重新发明轮子:已经有std::count:auto n = std::count(s.begin(), s.end(), 'e');
【解决方案2】:

方法从类字符串中查找返回第一个匹配的第一个字符的位置。 find 的返回类型是 size_t 并且由于 size_t 是无符号整数,所以如果没有找到匹配项,则返回 string::nopos 所以你应该将 find 的输出与 string::nopos 进行比较。

 if(Word.find("e") != string::nopos)
 {
    ...
 }

【讨论】:

  • 查看std::basic_string::find返回部分,密切关注npos
  • 没有溢出!奇数是 size_t 的最大值,npos 是这样定义的。
  • @Aconcagua 你可以在这里检查npos的定义en.cppreference.com/w/cpp/string/basic_string/npos被定义为-1所以转换为无符号
  • 负数到无符号数的转换不会溢出。有明确的规则如何执行(添加最大值 + 1 直到负值适合类型 - 这对于 2 的补码实际上是无操作)。
猜你喜欢
  • 1970-01-01
  • 2012-09-30
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2010-10-25
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多