2010-09-13 9 views
0

J'essaye d'écrire une méthode pour placer 2 variables aux nombres dans une chaîne de caractère. La chaîne ressemblerait à quelque chose comme:Extraire 2 numéros d'une chaîne de caractères?

[-][1][ ][ ][ ][ ][2][.][0][4] 

Où les nombres -1 et 2.04 pourraient être extraits. Je sais que la signature de la méthode pourrait ressembler à ceci:

sscanf(array[i],"%d%f",&someint,&somedouble) 

Mais je ne suis franchement pas sûr de savoir comment s'y prendre pour l'écrire. Toute aide serait grandement appréciée

+0

Mon mauvais, je le fais en C++ – Anon

Répondre

3

Cela devrait faire votre travail:

int x; 
    float y; 
    const char* ss = "-1 2.04"; 
    istringstream iss(ss); 
    iss >> x >> y; 
4

vous y êtes presque:

sscanf(array[i], "%d %lf",&someint, &somedouble) 

où l'espace signifie « 0, 1 ou plus de tout caractère blanc »

mais si vous utilisez C++ et non C, mieux vaut commencer avec les flux C++. Ce sera beaucoup plus facile.

#include <sstream> 
std::istringstream my_number_stream(array[i]); 
if (!(my_number_stream >> std::skipws >> someint >> somedouble)) { 
    // oh noes ! an error ! 
} 
+0

Je viens vraiment de commencer à utiliser C++, donc je ne suis pas vraiment familier avec les flux. Y a-t-il un moyen facile de faire cela en C? – Anon

+0

Il suffit d'utiliser la ligne sscanf que je viens d'écrire, avec une vérification d'erreur (ie: sscanf devrait renvoyer le nombre d'éléments qu'il a réussi à lire, c'est-à-dire 2). Ou je n'ai pas compris votre question. – BatchyX

0

Si l'entrée est fournie par l'utilisateur, par exemple Quelqu'un l'a tapé, d'abord vous devez le normaliser: changer plusieurs espaces en un, remplacer les tabulations par un espace, remplacer la virgule par un point (certaines personnes utilisent une virgule pour le séparateur décimal au lieu du point)() (ou tout ce que vous choisissez pour l'analyse) travail plus facile.

+2

Je pensais que sscanf était là pour faciliter * mon * travail, pas l'inverse ;-) –

Questions connexes