如何计算特定字符之前的字符数?

时间:2018-08-04 04:55:20

标签: c++

我在C ++的业余时间里玩耍,我一生似乎无法弄清楚如何计算字符串中特定字符之前的字符数。

例如:

Hello My Name \t is Bob!

我希望它计算\t之前的字符数(包括空格)。

这是我的尝试:

std::string test = "Hello My Name \t is Bob!"
std::string::size_type pos = line.find("\t");
int numOfCharacters = 0;

while (pos == std::string::npos) {
    numOfCharacters++;
    pos = pos + 1;
}

我对.find()的理解是,如果检索到npos,则意味着您找不到要查找的文本,因此我认为它会一直持续到找到{{1} },这样就可以退出while循环。

1 个答案:

答案 0 :(得分:6)

您对find()的理解是正确的,但是您对npos的使用是错误的。

如果找到子字符串 ,则无需进入循环,并且numOfCharacters仍为0。

如果未找到子字符串 ,则在不考虑字符串内容的情况下循环运行,直到pos最终增加到它变成npos(-1)为止。 numOfCharacters的最终值远不正确。

也许您正在考虑更多类似的东西?

std::string test = "Hello My Name \t is Bob!"
std::string::size_type pos = line.find("\t");
std::string::size_type i = 0;
int numOfCharacters = 0;

while (i < pos)
{
    numOfCharacters++;
    i = i + 1;
}

那将是多余的。字符串的索引为0,因此给定字符的索引也是 前面的字符数。如果您使用find(),则实际上根本不需要循环:

std::string test = "Hello My Name \t is Bob!"
std::string::size_type pos = test.find("\t");
int numOfCharacters = static_cast<int>(pos);

如果您要手动循环,则完全不要使用find()

std::string test = "Hello My Name \t is Bob!"
int numOfCharacters = -1;

for(std::string::size_type pos = 0; pos < test.size(); ++pos)
{
    if (test[pos] == '\t')
    {
        numOfCharacters = static_cast<int>(pos);
        break;
    }
}