Función para comprobar si la cadena contiene un número

Estoy trabajando en un proyecto en C++ (que acabo de empezar a aprender) y no puedo entender por qué esta función no funciona. Estoy intentando escribir una clase de "Persona" con una variable first_name y usar una función set_first_name para establecer el nombre. Set_first_name necesita llamar a una función (la de abajo) para verificar si el nombre tiene algún número. La función siempre devuelve falso, y me pregunto por qué. Además, ¿es esta la mejor manera de verificar los números o hay una mejor manera?

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

preguntado el 09 de marzo de 12 a las 23:03

5 Respuestas

Cambia todo tu || a &&.

Mejor todavía:

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

O, si lo tienes:

return std::any_of(s.begin(), s.end(), ::isdigit);

respondido 09 mar '12, 23:03

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

Salida:

H311o, W0r1d!: has digits: true

respondido 19 mar '13, 22:03

¿Eso se compila para ti tal como está? No obtienes un error como esta? - benjamin lindley

@BenjaminLindley Gracias por intentarlo, lo arreglé. - Peter Wood

Siempre vuelve false porque tu lógica es al revés. estas usando el || operador con == npos cheques Si falta algún dígito en particular en la cadena, == npos evalúa a true y || está satisfecho, por lo que regresa false. Necesitas usar != npos cheques y luego devolver true si alguna verificación se evalúa como 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;
}

o:

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

Una solución más simple es usar find_first_of() en lugar de find():

bool Person::contains_number(const std::string &c)
{
    return (c.find_first_of("0123456789") != std::string::npos);
}    

respondido 09 mar '12, 23:03

Cómo probar si una cadena contiene dígitos en C ++

¡Esto debería ser suficiente!

if (std::string::npos != s.find_first_of("0123456789"))
{
  std::cout << "digit(s)found!" << std::endl;
}

contestado el 23 de mayo de 17 a las 13:05

Está utilizando || (u operador) para verificar varias condiciones en una declaración if. El operador or devuelve verdadero (satisface la condición) si una de las expresiones es verdadera.

El operador or evalúa primero la expresión a su izquierda: si eso es verdadero, entonces no evalúa la expresión a su derecha y devuelve verdadero. Si la expresión de la izquierda es falsa, se evalúa la expresión de la derecha y se devuelve el resultado como resultado de || operador

Esto es lo que sucede en su función:

  • c contiene '0'? si no (porque std::string::npos en find() significa no encontrado) entonces devuelve falso
  • ¿c contiene '1'? si no, devuelve falso
  • ...

Entonces, reemplace los operadores or con && (operador and).

respondido 09 mar '12, 23:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.