Wątek przeniesiony 2015-12-22 15:17 z C/C++ przez ŁF.

Wyciąganie pojedyńczych znaków ze zmiennej string

0

Witam.
Mam mały problem bo zaczynam dopiero z C++.
Mianowicie chodzi o to jak wyciągnąć cyfry ze stringa? Np. mamy ciąg znaków dls?d1:s45;=dd-9m0aA7 i chcemy policzyć sumę cyfr zawartych w napisie zmiennej string.
Dodatkowo jest też problem, że mogą to być cyfry ujemne jak tu np "-9".
Ma ktoś jakiś pomysł?

1

Z takich bardziej patologicznych rozwiązań to można tak

#include <iostream>
#include <string>
using namespace std;

int main() {
    std::string str( "dls?d1:s45;=dd-9m0aA7" );

    bool sign = false;
    int sum = 0;

    for( char c : str )
    {
        if( c == '-' )
            sign = true;
        else
        {
            if( isdigit( c ) )
                sum += ( c - '0' )*( sign ? -1 : 1 );

            sign = false;
        }
    }

    std::cout << sum;
	return 0;
}

http://ideone.com/M2QN8o

3
plocienm napisał(a):

... że mogą to być cyfry ujemne jak tu np "-9". Ma ktoś jakiś pomysł?
Naprawdę nie mam pomysłu co do ujemnych cyfr, matematyka nie zna takiego pojęcia, ujemne liczby owszem, ale żeby cyfry ...
Co ma policzyć w przypadku: abc-523def ?
0 czy -523 ?

0

fakt nie ma ujemnych cyfr ;)
liczyć ma -523

0

No to musisz nieco przerobić program od @stryku

0

dobra teraz już chyba sobie poradzę, przynajmniej wiem jak zacząć
dzięki

0

Wydaje mi się, że jak najbardziej jest coś takiego jak ujemne cyfry. Cyfra obejmuje znaki od 0 do 9, więc ujemne cyfry występują między -0 a -9 http://sjp.pl/cyfra

4
Prosty Kot napisał(a):

Wydaje mi się, że jak najbardziej jest coś takiego jak ujemne cyfry. Cyfra obejmuje znaki od 0 do 9, więc ujemne cyfry występują między -0 a -9 http://sjp.pl/cyfra

Masz całkowitą racje, wydaje ci się.
To o czym mówisz nazywa się ujemna liczba jednocyfrowa.

0

Jak dla mnie tylko rozwiazanie @shalom.
Regrex będzie traktowany jako napis wiec nawet bardzo duże liczby nie bedą problemem.

2

fajne ćwiczonko z STL-a:
http://ideone.com/4yiAM1

Nie muszę chyba mówić, że RegExp to totalny overkill (jak to zwykle bywa w 95% przypadków użycia RegExpa).

0

Można jeszcze tak:

#include<iostream>
#include<string>
using namespace std;

int main() {
	string text = "dls?d1:s45;=dd-96m0aA7";
	string temp = "";
	int sum = 0;
	for (int i = 0; i < text.size() + 1; ++i) {
		if (isdigit(text[i])) temp = temp + text[i];
		else {
			if (temp != "") {
				int number = stoi(temp);
				int pos = i - temp.size() - 1;
				if (pos >= 0)
					if (text[pos] == '-') number *= -1;
				sum += number;
				temp = "";
			}
		}
	}
	cout << sum << endl;
	return 0;
}

http://ideone.com/Jk4jNW

Programik rozpoznaje np. samotne znaki -.

0

Może ja też wkleję rozsądną wersję :D http://ideone.com/GLMKlp

#include <iostream>
#include <string>
using namespace std;

int main()
  {
   string text = "dls?d1:s45;=dd-96m0aA7";
   int sum=0,pos=-1;
   for(int i=0;i<=text.size();++i)
     {
      if(isdigit(text[i]))
        {
         if(pos<0) pos=i;	
        }
      else if(pos>=0)
        {
         sum+=(((pos)&&(text[pos-1]=='-'))?-1:1)*atoi(&text[pos]);
         pos=-1;
        }
     }
   cout<<sum<<endl;
   return 0;
  }

Z tym że przypominam że nadał w zadaniu nie wiadomo co robić z tym fantem: abc9999999999999999999def9999999999999999999ghi

1

1001-1002 i Regexp traci cały swój urok.

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