bool e_broj(const string &s){
string::const_iterator it = s.begin();
while(it != s.end() && isdigit(*it)){
++it;
}
return !s.empty() && it == s.end();
}
我有这个功能来检查字符串是否是数字。我在网上发现了这个片段,我想了解它是如何工作的。
// this declares it as the beginning of the string (iterator)
string::const_iterator it = s.begin();
// this checks until the end of the string and
// checks if each character of the iterator is a digit?
while(it != s.end() && isdigit(*it)){
// this line increases the iterator for next
// character after checking the previous character?
++it;
// this line returns true (is number) if the iterator
// came to the end of the string and the string is empty?
return !s.empty() && it == s.end();
答案 0 :(得分:3)
您的理解几乎正确。唯一的错误是在最后:
// this line returns true (is number) if the iterator
// came to the end of the string and the string is empty?
return !s.empty() && it == s.end();
这应该说“并且字符串不为空”,因为表达式为!s.empty()
,而不仅仅是s.empty()
。
你可能只是措辞有趣,但要清楚,while
循环上的条件将使迭代器在字符串中移动,而不是在结尾处,而字符仍然是数字。
关于迭代器的术语让我觉得你并不完全理解它在做什么。您可以将迭代器视为指针(实际上,指针是迭代器,但反之亦然)。第一行为您提供了一个“指向”字符串中第一个字符的迭代器。执行it++
会将迭代器移动到下一个字符。 s.end()
给出一个迭代器,它指出一个超过字符串结尾的部分(这是一个有效的迭代器)。 *it
为您提供迭代器“指向”的字符。
答案 1 :(得分:2)
当一个非数字出现时,while循环停止在字符串OR处。
因此,如果我们没有一直前进到最后(it != s.end()
),那么该字符串具有非数字,因此不是数字。
空字符串是一种特殊情况:它没有非数字,但它也不是数字。