#include <stdio.h>
#include <string>
int main(void)
{
printf("%u\n", std::string("\n").find_first_not_of(" \t\n\v\f\r", 0, 1));
}
以下程序打印0,而不是我期望的std :: string :: npos。为什么呢?
答案 0 :(得分:5)
您的电话匹配:
size_t find_first_not_of ( const char* s, size_t pos, size_t n ) const;
n
是 s 中字符的数量,你传递的是1.所以,你正在搜索第一个不是空格的字符。 <{1}}字符串的其余部分将被忽略。
可能你只想要:
" \t\n\v\f\r"
答案 1 :(得分:2)
第三个参数并不代表你的想法。
答案 2 :(得分:0)
根据this,string::find_first_not_of
搜索对象中不属于str,s或c的第一个字符,并返回其位置。由于“\ t”是这样的字符,因此返回值为0.
答案 3 :(得分:0)
根据您要打印的内容,我可以说第三个参数应该是您传递的字符串的长度。所以这是更正后的版本:
#include <stdio.h>
#include <string>
int main(void)
{
std::string s=" \t\n\v\f\r";
printf("%u\n", std::string("\n").find_first_not_of(s.c_str(), 0, s.length()));
//since now I'm using std::string, you can simply write:
printf("%u\n", std::string("\n").find_first_not_of(s));
}
在ideone演示:http://ideone.com/y5qCX
答案 4 :(得分:0)
看到它:
#include <stdio.h>
#include <string>
int main(void)
{
std::string s("\n");
if( s.find_first_not_of(" \t\n\v\f\r", 0, 1) != std::string::npos )
printf("%u\n", s.find_first_not_of(" \t\n\v\f\r", 0, 1));
else
puts("npos");
return 0;
}
答案 5 :(得分:0)
方法find_first_not_of
将最后一个参数解释为第一个参数中要考虑的char数,而不是字符串。
size_type std::string::find_first_not_of(
const char* str, size_type index, size_type num) const;
参数num
是str
中要考虑的数字,而不是this
中要考虑的数字!所以在你的情况下,它只考虑" \t\n\v\f\r"
的第一个特征。您的代码相当于:
#include <cstdio>
#include <string>
int main(void)
{
printf("%u\n", std::string("\n").find_first_not_of(" ", 0));
}
如果您只想匹配std::string
的子字符串,我认为您必须在显式子字符串上调用find_first_not_of
,即:
#include <cstdio>
#include <string>
int main(void)
{
printf("%u\n", std::string("\n").substr(0, 1).find_first_not_of(" \t\n\v\f\r"));
}
BTW,here是对find_first_not_of
方法行为的描述:
find_first_not_of()函数:
- 返回当前字符串中第一个字符的索引,该字符串与str中的任何字符都不匹配,从index开始搜索,如果找不到任何内容则为string :: npos,
- 从索引开始搜索当前字符串,查找与str中第一个num字符不匹配的任何字符,返回符合此条件的第一个字符的当前字符串中的索引,否则返回string :: npos,
- 或返回当前字符串中第一次出现的与ch不匹配的字符的索引,在index,string :: npos处开始搜索,如果找不到任何内容。