nullptr不会中断零终止字符串的循环

时间:2018-12-31 20:17:57

标签: c++ nullptr

我尝试使用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

2 个答案:

答案 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;
}

随时询问您是否有任何问题。 干杯。