NULLPTR用于终止C风格的字符串

Is nullptr used to terminate C-style strings?

本文关键字:字符串 风格 用于 终止 NULLPTR      更新时间:2023-10-16

我对在中的示例中使用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; 
}
// The definition of count_x() assumes that the char* is a C-style string,
// that is, that the pointer points to a zero-terminated array of char.

我知道,如果p未分配,count_x应该终止,并且当for循环达到p引用的c风格字符串的末端时,则应终止。

但是,当我构建一个主要函数以使用count_x()时,它似乎永远不会正确终止:

int main () {
    char teststring[] = {'b', 'l', 'a', 'h', ''}; 
    cout << "teststring is: " << teststring << endl; 
    cout << "Number of b's is: " << count_x(teststring, 'b') << endl; 
    return 0;  
}

执行此打印会大量垃圾,然后以分段故障退出。如果我用for (; *p!=''; ++p)中的for (; p!=nullptr; ++p)替换CC_1,则可以正确执行。我想这意味着字符串未正确终止。如果是这样,我如何终止C风格的字符串,以便在此处使用NULLPTR?

编辑:评论中有一个讨论,阐明了这种情况。我使用的是2013年9月的书的第一印刷品,上面的印刷错误。该书的第三张印刷品(评论中的链接)具有更正的示例,该示例使用for (; *p!=0; ++p)而不是for (; p!=nullptr; ++p)。该书的勘误表中还记录了此更正。谢谢!

edit2:对不起,这显然已经在这里提出过:在" c 之旅"中的错误代码。或不合格的编译器?

no,空指针不用于终止字符串。使用NUL字符。它们是不同的事情,但是如果将它们分配给C中的整数,结果始终是相同的:零(0)。

在C中表示一个NUL字符为'',并占用一个char存储。null指针在C为0中表示,并占用与void *相同的存储空间。例如,在64位计算机上,void *为8个字节,而''是一个字节。

即,nullptr与''不同。字符是null字符,称为nul,但不应该称为null字节或空字符。