我尝试使用C ++ Tour中给出的以下代码示例,该示例使用nullptr打破零终止字符串的循环。但是,我的示例程序似乎并没有停止循环。
这本书的摘录:
本书第一版代码:
```
int count_x(char∗ p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to nothing)
{
if (p==nullptr) return 0;
int count = 0;
for (; p!=nullptr; ++p)
if (∗p==x)
++count;
return count;
}
```
第二个简化版
```int count_x(char* p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to
// nothing)
{
int count = 0;
while (p) {
if (*p==x)
++count;
++p;
}
return count;
}```
声明本书中的以下代码: while语句将执行直到其条件变为假为止。 测试指针(例如,while(p))等同于将指针与空指针(例如, while(p!= nullptr))。
我的程序使用相同的结构:
char name[] = "ABCD";
char *p = name;
int count = 0;
int loopc = 0;
while (p)
{
loopc++;
if(*p == '\0')
cout << "zero found\n";
else
cout << *p << "\n";
//emergency stop
if (loopc == 12)
break;
p++;
}
预期:
应在打印名称后停止。
实际:
A
B
C
D
zero found
zero found
zero found
zero found
zero found
zero found
zero found
zero found
答案 0 :(得分:0)
感谢所有有用的评论。
似乎作者在较早的版本(1st)中给出了错误的示例,后来在2018年发布的第二版中对其进行了纠正。
从新版本更正的版本:
int count_x(char∗ p, char x)
// count the number of occurrences of x in p[]
// p is assumed to point to a zero-terminated array of char (or to nothing)
{
if (p==nullptr) return 0;
int count = 0;
for (; *p!=0; ++p)
if (∗p==x)
++count;
return count;
}
答案 1 :(得分:0)
第一个版本通过0
时应返回nullptr
。但是在for循环中,您只传递了一次。
无论如何,只有一个char*
(考虑使用std::string
顺便说一句...)
这是我的快速解决方案,请尝试理解它:
int count_x(char* c_ptr, char c) {
if (c_ptr == nullptr) return 0;
int count = 0;
/* Note that I check if *c_ptr is '\0' that's the **value**
* pointed to by c_ptr
*/
for (; *c_ptr != '\0'; ++c_ptr) // '\0' is a nul character
if (*c_ptr == c) ++count;
return count;
}
int foo(const std::string& word, char letter) noexcept {
int count = 0;
for (const auto& c: word) { // for all const char ref in word
if (c == letter) ++count;
}
return count;
}
int main() {
int a = count_x("acbccc", 'c');
int b = foo("acbccc", 'c');
std::cout << a << '\n' << b;
}
随时询问您是否有任何问题。 干杯。