std :: string.find_first_not_of,意外返回值

时间:2011-03-12 18:59:24

标签: c++ string find

#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。为什么呢?

6 个答案:

答案 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)

根据thisstring::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;

参数numstr中要考虑的数字,而不是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处开始搜索,如果找不到任何内容。
  •