如何使用strspn模仿std :: string的find_first_not_of

时间:2017-07-09 15:05:03

标签: c++ string find

我试图创建一个类似于std :: string的自定义字符串类。

我在执行&find #first_not_of'时遇到了问题。

这是我的测试代码

#include <iostream>

class String {

private:

    char *m_data;
    int m_length;

    char *alloc(int size);
    int length() const {return m_length;}
    int size() const {return m_length;}
    const char *c_str() const {return m_data;}

public:

    String(const char *str=0);

    int find_first_not_of(const char *str);
    static const int npos;
};

const int String::npos = -1;

char * String::alloc(int size)
{
    char * str = new char[size+1];
    return str;
}

String::String(const char *str)
{
    if (!str) str = "";
    m_length = static_cast<int>(strlen(str));
    m_data = alloc(m_length);
    strcpy(m_data, str);
}

int String::find_first_not_of(const char *str)
{
    size_t len = strspn(c_str(), str);

    if (len == 0)
        return -1;
    else
        return len;
}

int main(int argc, const char * argv[]) {

    String A = "123";
    std::string B = "123";

    if (A.find_first_not_of("0123456789") == -1)
        std::cout << "A is digit" << std::endl;
    else
        std::cout << "A is not digit" << std::endl;

    if (B.find_first_not_of("0123456789") == -1)
        std::cout << "B is digit" << std::endl;
    else
        std::cout << "B is not digit" << std::endl;
    return 0;
}

如果我运行代码,这就是我看到的结果。

A is not digit
B is digit
Program ended with exit code: 0

有人可以指出我失踪了吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您将String::find_first_not_ofstd::string::find_first_not_of混淆。它们是具有不同功能的不同功能。

我真的不明白String::find_first_not_of需要做什么,但这是每个人都返回的内容(一个是字符串的长度,另一个是位置):

std :: string :: find_first_if_not(来自here):

  

第一个不匹配的字符的位置。   如果未找到此类字符,则该函数返回string :: npos。

strspn(来自here):

  

str1的初始部分的长度,仅包含出现在str2中的字符。   因此,如果str1中的所有字符都在str2中,则该函数返回整个str1字符串的长度,如果str1中的第一个字符不在str2中,则该函数返回零。

所以即使功能的内部工作也不同。

您应该可以根据此信息关注。

答案 1 :(得分:1)

这个就像std :: string的find_first_not_of一样。

int String::find_first_not_of(const char *str, int pos)
{
    const int len = static_cast<int>(strspn(c_str() + pos, str));
    if (len + pos == m_length)
        return -1; //npos
    else
        return len + pos;
}

@ Garmekain的解释非常有帮助。谢谢。