Функция для проверки, содержит ли строка число - PullRequest
3 голосов
/ 10 марта 2012

Я работаю над проектом на c ++ (который я только начал изучать) и не могу понять, почему эта функция не работает. Я пытаюсь написать класс «Person» с переменной first_name и использовать функцию set_first_name для установки имени. Set_first_name необходимо вызвать функцию (ниже), чтобы проверить, есть ли в имени какие-либо числа. Функция всегда возвращает false, и мне интересно, почему? Кроме того, это лучший способ проверить номера или есть лучший способ?

   bool Person::contains_number(std::string c){ // checks if a string contains a number
        if (c.find('0') == std::string::npos || c.find('1') == std::string::npos || c.find('2') == std::string::npos || c.find('3') == std::string::npos
        || c.find('4') == std::string::npos || c.find('5') == std::string::npos || c.find('6') == std::string::npos || c.find('7') == std::string::npos
        || c.find('8') == std::string::npos || c.find('9') == std::string::npos){// checks if it contains number

        return false;
        }
        return true;
    }

Ответы [ 5 ]

13 голосов
/ 10 марта 2012

Измените все свои || на &&.

Еще лучше:

return std::find_if(s.begin(), s.end(), ::isdigit) != s.end();        

Или, если он у вас есть:

return std::any_of(s.begin(), s.end(), ::isdigit);
10 голосов
/ 10 марта 2012

C ++ 11:

#include <algorithm>
#include <cctype>
#include <string>
#include <iostream>

bool has_any_digits(const std::string& s)
{
    return std::any_of(s.begin(), s.end(), ::isdigit);
}

int main()
{
    std::string query("H311o, W0r1d!");

    std::cout << query << ": has digits: "
              << std::boolalpha
              << has_any_digits(query)
              << std::endl;
    return 1;
}

Выход:

H311o, W0r1d!: has digits: true

5 голосов
/ 10 марта 2012

Всегда возвращает false, потому что ваша логика обратная. Вы используете оператор || с проверками == npos. Если в строке отсутствует какая-либо конкретная цифра, == npos оценивается как true и || удовлетворяется, поэтому вы возвращаете false. Вам необходимо использовать != npos чеки, а затем вернуть true, если какой-либо чек оценивается как true:

bool Person::contains_number(const std::string &c)
{
    if (c.find('0') != std::string::npos ||
        c.find('1') != std::string::npos ||
        c.find('2') != std::string::npos ||
        c.find('3') != std::string::npos ||
        c.find('4') != std::string::npos ||
        c.find('5') != std::string::npos ||
        c.find('6') != std::string::npos ||
        c.find('7') != std::string::npos ||
        c.find('8') != std::string::npos ||
        c.find('9') != std::string::npos)
    {
        return true;
    }

    return false;
}

Или:

bool Person::contains_number(const std::string &c)
{
    return (
        c.find('0') != std::string::npos ||
        c.find('1') != std::string::npos ||
        c.find('2') != std::string::npos ||
        c.find('3') != std::string::npos ||
        c.find('4') != std::string::npos ||
        c.find('5') != std::string::npos ||
        c.find('6') != std::string::npos ||
        c.find('7') != std::string::npos ||
        c.find('8') != std::string::npos ||
        c.find('9') != std::string::npos
    );
}

Более простое решение - использовать find_first_of() вместо find():

bool Person::contains_number(const std::string &c)
{
    return (c.find_first_of("0123456789") != std::string::npos);
}    
5 голосов
/ 10 марта 2012

Как проверить, содержит ли строка какие-либо цифры в C ++

Это следует сделать!

if (std::string::npos != s.find_first_of("0123456789"))
{
  std::cout << "digit(s)found!" << std::endl;
}
1 голос
/ 10 марта 2012

Вы используете || (или оператор) для проверки нескольких условий в операторе if.Оператор or возвращает true (удовлетворяет условию), если одно из выражений истинно.

Оператор or сначала вычисляет выражение слева: если это правда, то оно не оценивает выражение справаи возвращает истину.Если выражение слева является ложным, то выражение справа оценивается, и результат его возвращается как результат ||оператор

Вот что происходит в вашей функции:

  • содержит ли c '0'?если нет (потому что std :: string :: npos в find () означает, что не найден), то вернуть false
  • содержит ли c '1'?если нет, вернуть false
  • ...

Итак, замените операторы или на && (и оператор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...