Znajdywanie liczb w stringu

2011-09-18 14:05
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

edytowany 1x, ostatnio: czarny020, 2011-09-18 14:06

Pozostało 580 znaków

2011-09-18 14:12
0

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

Pozostało 580 znaków

2011-09-18 14:13
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.


Pozostało 580 znaków

2011-09-18 14:29
0

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


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
Tylko ręcznie będzie trza potem je sklejać w liczby :P - hauleth 2011-09-18 14:30
Co nie zmienia faktu, że nie ma gotowej funkcji na wyodrębnienie liczb z napisów, a o to pytał autor. - Rev 2011-09-18 14:31

Pozostało 580 znaków

2011-09-18 14:37
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 :/

Pozostało 580 znaków

2011-09-18 14:41
1

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

Za takie coś powinni cię rozstrzelać.

Ma być:

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

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit, 2011-09-18 14:43

Pozostało 580 znaków

2011-09-18 14:42
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[...]ibs/regex/doc/html/index.html
MS Greta - http://research.microsoft.com[...]293-34c054efe749/default.aspx
POSIX regex.h - http://pubs.opengroup.org/onl[...]9695399/basedefs/regex.h.html

Osobiście polecam nr 1.

Na pytanie w wątku odpowiada ta strona:
http://bit.ly/nbHNw2


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2011-09-18 15:56
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?

Pozostało 580 znaków

2011-09-18 16:28
Rev
0

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


Pozostało 580 znaków

2011-09-18 16:41
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;
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit, 2011-09-18 17:23
Poprawione: ze scanf("%s") na gets() - Wibowit 2011-09-18 17:23

Pozostało 580 znaków

2011-09-18 17:40
szypxx
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();
    }
}
Testowałeś to? Nie znam się na javie, ale na oko wynik będzie 2217... - vpiotr 2011-09-18 17:54
Tak testowałem i wynik jest taki jak napisałeś :) - szypxx 2011-09-19 15:12

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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