如何检查char * p是否到达C字符串的结尾?

时间:2011-06-12 19:04:57

标签: c++

template<class IntType>
IntType atoi_unsafe(const char* source)
{
    IntType result = IntType();
    while (source)
    {
        auto t = *source;
        result *= 10;
        result += (*source - 48);
        ++source;
    }
    return result;
}

并在main()我有:

char* number = "14256";
atoi_unsafe<unsigned>(number);

但条件while (source)似乎没有意识到source已遍历整个C字符串。应该如何正确检查字符串的结尾?

3 个答案:

答案 0 :(得分:12)

while(source)是真的,直到指针回绕到0,但在现代系统中可能会崩溃。您需要取消引用指针以找到空字节while(*source)

我讨厌发布简短的答案

答案 1 :(得分:11)

指针在字符串末尾不会变为零;当指向的值变为零时,找到字符串的结尾。因此:

while (*source != '\0')

您可以更紧凑地将整个函数编写为:

template<class IntType>
IntType atoi_unsafe(const char* source)
{
    IntType result = IntType();
    char c;
    while ((c = *source++) != '\0')
        result = result * 10 + (c - '0');
    return result;
}

当然,它不使用auto关键字。另请注意'\0''0'之间的区别。循环体中赋值中的括号不是必需的。

您的代码只处理没有符号的字符串 - 并且应该可以证明字符实际上也是数字(如果输入无效,可能会引发异常)。 “不安全”的称谓当然适用。另请注意,如果您为有符号整数类型实例化模板并且值溢出,则会调用未定义的行为。至少对于无符号类型,算术被定义,即使可能不是预期的。

答案 2 :(得分:3)

您需要在字符串末尾查找null-terminator。等待指针回绕到0可能永远不会发生。使用while (*source)作为循环。