我在第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;
}
这让我在得出这是有缺陷的代码的结论之前三思。两个版本看起来都有缺陷。
3条答案
按热度按时间xyhw6mcr1#
这列在Errata for 2nd printing of A Tour of C++:
第一章:
pp 11 - 12:count_if()的代码是错误的(没有做它声称的事情),但是关于语言的观点是正确的。
第二次印刷的法典现在是:
在The C++ Programming Language (4th Edition)中有一个类似的示例,* A Tour of C++* 基于该示例,但它没有此错误。
qzwqbdag2#
gcc在4.7.3上有很好的兼容性,但是你必须用-std=c++11编译,在gnu webpage上有一些图表,但是是的,这不是一个标准的东西,那个指针永远不会为NULL,至少在它溢出之前不会,所以除非你分配了char * 上面的所有内存,否则它会发生segfault,这只是一个bug。
euoag5mw3#
这是一个修正的版本。它检查 *p指针是否真的为空。它还确保有两个输入变量。