7
votes

Comment tester si une chaîne contient des chiffres en C ++

Je veux savoir si une chaîne a des chiffres ou s'il n'y a pas de chiffres. Y a-t-il une fonction qui le fait facilement?


0 commentaires

6 Réponses :


19
votes

Peut-être ce qui suit: xxx


1 commentaires

Cela nécessite des étapes O (10 * N). Un Solution avec Find_IF ou Find_any est plus rapide, nécessitant uniquement O (n) étapes.



2
votes

donnée std :: string s; xxx


0 commentaires

7
votes
boost::regex re("[0-9]");
const std::string src = "test 123 test";
boost::match_results<std::string::const_iterator> what; 
bool search_result = 
   boost::regex_search(src.begin(), src.end(), what, re, boost::match_default);

0 commentaires

3
votes

wind_first_of est probablement votre meilleur pari, mais je joue avec des facettes iostream, voici une alternative: xxx

modification chaîne à wstring et char à wchar et vous pourriez théoriquement avoir une chance de manipuler ces bizarres de largeur fixe utilisée dans certains scripts asiatiques.


1 commentaires

kewl, un uppote. Malheureusement, j'ai essayé cela plus tard (dans Mac OS X, qui a des locaux quelque peu lâches) et les chiffres FULLWIDTH ont été non numériques.



6
votes
#include <cctype>
#include <algorithm>
#include <string>

if (std::find_if(s.begin(), s.end(), (int(*)(int))std::isdigit) != s.end())
{
  // contains digit
}

5 commentaires

C'est bizarre, en VC ++, la distribution n'est pas nécessaire et, dans GNU, il n'est pas nécessaire que si vous supprimez la pièce std :: avant isdigit . Quelqu'un sait pourquoi c'est le cas?


@Manuel: comprend le Unix / C et importe son contenu avec à l'aide de , sur Mac OS X au moins . §17.4.1.2 / 4 semblerait dire que cette méthodologie est illégale et ne doit pas définir :: isdigit . Pourrait-il être une non-conformité intentionnelle?


@Potatoswatter - VSC ++ 2008 fait la même chose, non seulement pour CTYPE mais pour toute la bibliothèque C STD. Quoi qu'il en soit, cela ne répond pas pourquoi la version avec std :: en avant nécessite une distribution.


C'est parce que le isdigit à partir de est une fonction avec type int (*) (int) déjà. std :: isdigit est un modèle, donc sans la distribution, elle est ambiguë. C'est dans , mais je m'attends à ce que vous le ramassiez à partir de . Donc, une fois a fait sa chose, ce que nous ne sommes pas sûrs est conforme mais est certainement courant, :: isdigit est une fonction particulière, alors que std :: isdigit est surchargé comme fonction de plus le modèle de . Aucun des instanciations du modèle n'a de retour int , mais sans la distribution, ils ne peuvent pas être exclus.


@Steve - merci pour la grande explication, j'avais oublié locale



2
votes

Il n'y a rien de standard à cet effet, mais il n'est pas difficile de faire un: xxx pré>

et vous pouvez l'utiliser comme: p> xxx pré> p> EDIT: p>

ou même meilleure version em> (car elle peut fonctionner avec n'importe quel conteneur et avec des conteneurs Const et non-Const): P>

const std::string str("abcde123xyz");
printf("Has digits: %s\n", has_digits(str.begin(), str.end()) ? "yes" : "no");


0 commentaires