Czy jest jakaś gotowa funkcja która znajduje liczby w stringu? np.
string m("Ucze sie stringa 1 miesiac czyli dokladnie 30 dni");
czyli liczby 1 i 30
Czy jest jakaś gotowa funkcja która znajduje liczby w stringu? np.
string m("Ucze sie stringa 1 miesiac czyli dokladnie 30 dni");
czyli liczby 1 i 30
Wyrażenia regularne? Nie wiem jakie funkcje za to odpowiadają w C++, ale na pewno wujek google zna odpowiedź
Jest, ale pojawi się w standardzie dopiero w C++11 a mianowicie wyrażenia regularne. Możesz użyć Boost::RegExp lub zobaczyć czy twój kompilator już ma zaimplementowane je w bibliotece standardowej.
A można sprawdzić przecież czy dany znak jest liczbą czy nie.
void func(string text){
string::iterator it;
short n=0;
std::getline(std::cin, text)
for(it = text.begin(); it < text.end(); it++)
if('1' <= *it <= '9') n++;
printf("%hd", n);
}
problem taki, że dla string text("Ula ma 2 koty i 3 psy") zamiast wypisać na output 2, wyświetla 21 :/
if('1' <= *it <= '9')
Za takie coś powinni cię rozstrzelać.
Ma być:
if (('1' <= *it) && (*it <= '9'))
Sarrus napisał(a)
Wyrażenia regularne? Nie wiem jakie funkcje za to odpowiadają w C++, ale na pewno wujek google zna odpowiedź
Boost::Xpressive - http://www.boost.org/doc/libs/1_41_0/doc/html/xpressive.html
Boost::Regex - http://www.boost.org/doc/libs/1_46_1/libs/regex/doc/html/index.html
MS Greta - http://research.microsoft.com/en-us/downloads/bd99f343-4ff4-4041-8293-34c054efe749/default.aspx
POSIX regex.h - http://pubs.opengroup.org/onlinepubs/009695399/basedefs/regex.h.html
Osobiście polecam nr 1.
Na pytanie w wątku odpowiada ta strona:
http://bit.ly/nbHNw2
Napisałem taką funkcje, która sprawdza ile jest liczb i wyrazów w zdaniu:
void func(string text, short n, short w){
string::iterator it;
while(std::getline(std::cin, text)){
n = 0; w =0;
for(it = text.begin(); it < text.end(); it++){
if('1' <= *it && *it <= '9') n++;
else if(*it == ' ' && ('A' <=*(it-1) && *(it-1) <= 'z')) w++;
else if(it == text.end()-1 && ('A' <= *it && *it <= 'z')) w++;
}
if(n==0 || w==0) continue;
printf("%hd %hd\n", n, w);
}
}
Czy ktoś jest w stanie napisać taką funkcje prościej?
Nie ogarniam za bardzo dlaczego używasz argumentów funkcji zamiast deklarować zmienne lokalne.
Może nie krócej, ale prościej:
#include <cstdio>
#include <cstdlib>
#include <ctype.h>
/*
*
*/
int main(int argc, char** argv) {
char napis[999];
gets(napis);
int liczniki[3] = {0, 0, 0};
int poprzedniTyp = 2;
for (int i = 0; napis[i] != '\0'; i++) {
unsigned char c = napis[i];
int typ;
if (isdigit(c)) {
typ = 0;
} else if (isalpha(c)) {
typ = 1;
} else {
typ = 2;
}
if (poprzedniTyp != typ) {
liczniki[typ]++;
}
poprzedniTyp = typ;
}
printf("liczb: %d, slow: %d\n", liczniki[0], liczniki[1]);
return EXIT_SUCCESS;
}
A może w javie? Ktoś go kiedyś wrzucił na forum.
public class ZnajdzCyfryWStringach{
public static void main(String[] args)
{
String s = "si22ema17";
System.out.println(znajdzCyfry(s));
}
static String znajdzCyfry(String string){
StringBuilder wynik = new StringBuilder();
for (int i = 0; i < string.length(); i++) {
if(Character.isDigit(string.charAt(i))){
wynik.append(string.charAt(i));
}
}
return wynik.toString();
}
}
Ja bym zaczął od ustalenia co jest liczbą? "76" pewnie tak, a "23.55", "23,55", "6666666666666666666666666666666666666666666668888888888" też?
I co jest wyrazem, "biało-czerwony" jest wyrazem?
"Jan1Jan" też wymaga sprecyzowania.