我在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循环。
答案 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;
}
}