std :: string.find_first_not_of, неожиданное возвращаемое значение - PullRequest
0 голосов
/ 12 марта 2011
#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 ]

5 голосов
/ 12 марта 2011

Ваш звонок соответствует:

size_t find_first_not_of ( const char* s, size_t pos, size_t n ) const;

n - это число символов в s , и вы передаете 1. Итак, вы ищете первый символ, который не является пробелом. Остальная часть вашей строки " \t\n\v\f\r" игнорируется.

Скорее всего, вы просто хотите:

find_first_not_of(" \t\n\v\f\r")
2 голосов
/ 12 марта 2011

Третий параметр не означает, что вы думаете, что он делает.

0 голосов
/ 12 марта 2011

Метод find_first_not_of интерпретирует последний аргумент как число символов, которые необходимо учитывать в первом аргументе, а не в строке.

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"));
}

Кстати, здесь - описание поведения find_first_not_of метода:

Функция find_first_not_of () либо:

  • возвращает индекс первого символа в текущей строке, который не соответствует ни одному символу в str, начиная поиск по индексу, string :: npos, если ничего не найдено,
  • ищет в текущей строке, начиная с индекса, любой символ, который не соответствует первым num символам в str, возвращая индекс в текущей строке первого найденного символа, который соответствует этому критерию, в противном случае возвращает строку :: npos,
  • или возвращает индекс первого вхождения символа, который не соответствует ch в текущей строке, начиная поиск по индексу, string :: npos, если ничего не найдено.
0 голосов
/ 12 марта 2011

Посмотри:

#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;
}
0 голосов
/ 12 марта 2011

Исходя из того, что вы хотите напечатать, я могу сказать, что третий параметр должен быть длиной строки, которую вы передали. Итак, вот исправленная версия:

#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

0 голосов
/ 12 марта 2011

Согласно this , string::find_first_not_of ищет первый символ в объекте, который не является частью str, s или c, и возвращает его позицию. Поскольку "\ t" является таким символом, возвращаемое значение равно 0.

...