Znajdywanie liczb w stringu

0

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

0

Wyrażenia regularne? Nie wiem jakie funkcje za to odpowiadają w C++, ale na pewno wujek google zna odpowiedź

1

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.

0

A można sprawdzić przecież czy dany znak jest liczbą czy nie.

0
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 :/

1

if('1' <= *it <= '9')

Za takie coś powinni cię rozstrzelać.

Ma być:

if (('1' <= *it) && (*it <= '9'))
1
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

0

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?

0

Nie ogarniam za bardzo dlaczego używasz argumentów funkcji zamiast deklarować zmienne lokalne.

0

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

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1