我在“A Tour of C ++”中看到了以下功能,第12页:
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)
退出。我很高兴看到这个错误,因为代码看起来不适合我开始。但是,现在很好奇。书中建议的代码是不正确的还是编译器不符合C ++ 11?编译器是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;
}
在结束这是错误的代码之前,我让我三思而后行。两个版本似乎都是错误的。
答案 0 :(得分:5)
这列在Errata for 2nd printing of A Tour of C++:
中第1章:
第11-12页:count_if()的代码是错误的(没有做它声称的内容 to),但关于语言的观点是正确的。
第二次印刷中的代码现为:
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)中有一个类似的例子,其中 C ++ 是基于它的,但它没有这个错误。
答案 1 :(得分:3)
gcc在4.7.3具有良好的兼容性,但你必须使用-std = c ++ 11进行编译。 gnu webpage上有图表。但是,这不是一个标准的东西,指针永远不会是NULL,至少直到它溢出,所以除非你已经分配了char *之上的所有内存,否则它将是段错误。这只是一个错误。