“C++教程”中的错误代码或不兼容的编译器?

omtl5h9j  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(101)

我在第12页的“C++教程"中看到了以下函数:

int count_x(char const* p, char x)
{
   int count = 0;
   while (p)
   {
      if (*p == x) ++count;
      ++p;
   }
   return count;
}

我觉得while (p)这一行不太对,我想应该是while (*p),但是,我不想太冒昧,我用下面的代码测试了这个函数。

int main(int argc, char** argv)
{
   char* p = argv[1];
   char x = argv[2][0];
   int count = count_x(p, x);

   std::cout
      << "Number of occurences of "
      << x << " in " << p << ": " << count << std::endl;
   return 0;
}

当我运行这个程序时,它以Segmentation fault (core dumped)退出。我很高兴看到这个错误,因为代码在我看来并不正确。然而,现在我很好奇。是书中建议的代码不正确还是编译器不符合C11?编译器是g(GCC)4.7.3。
count_x代码的奇怪之处在于,作者Bjarne Stroustrup在完成我首先编写的代码之前,从下面的实现开始。

int count_x(char const* p, char x)
{
   if(p==nullptr) return 0;
   int count = 0;
   for (; p!=nullptr; ++p)
   {
      if (*p == x)
         ++count;
   }
   return count;
}

这让我在得出这是有缺陷的代码的结论之前三思。两个版本看起来都有缺陷。

xyhw6mcr

xyhw6mcr1#

这列在Errata for 2nd printing of A Tour of C++
第一章:
pp 11 - 12:count_if()的代码是错误的(没有做它声称的事情),但是关于语言的观点是正确的。
第二次印刷的法典现在是:

int count_x(char* p, char x)
    // count the number of occurences 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;
    while(*p) {
        if(*p==x)
            ++count;
        ++p;
    }
    return count;
}

The C++ Programming Language (4th Edition)中有一个类似的示例,* A Tour of C++* 基于该示例,但它没有此错误。

qzwqbdag

qzwqbdag2#

gcc在4.7.3上有很好的兼容性,但是你必须用-std=c++11编译,在gnu webpage上有一些图表,但是是的,这不是一个标准的东西,那个指针永远不会为NULL,至少在它溢出之前不会,所以除非你分配了char * 上面的所有内存,否则它会发生segfault,这只是一个bug。

euoag5mw

euoag5mw3#

这是一个修正的版本。它检查 *p指针是否真的为空。它还确保有两个输入变量。

#include <iostream>

int count_x(char const* p, char x)
{
   int count = 0;
   while (*p) // check if *p is not a null character
   {
      if (*p == x) ++count;
      ++p;
   }
   return count;
}
int main(int argc, char** argv)
{
   if (argc < 3) // check if there are at least two arguments
   {
      std::cout << "Error: Not enough arguments" << std::endl;
      return 1;
   }
   char* p = argv[1];
   char x = argv[2][0];
   int count = count_x(p, x);

   std::cout
      << "Number of occurences of "
      << x << " in " << p << ": " << count << std::endl;
   return 0;
}

相关问题