我试图创建一个类似于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
有人可以指出我失踪了吗?
谢谢!
答案 0 :(得分:2)
您将String::find_first_not_of
与std::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的解释非常有帮助。谢谢。