Pobieanie danych ze stringa

0

Potrzebuje pomocy z przetworzeniem stringa w języku c++.
Mając 20 elementową tablicę oraz stringa chce wprowadzić do niej odpowiednio dane np:

string d20+2d10+d8: wprowadza 1 do komórki 20, 2 do komórki 10, 1 do komórki 8 ,reszta pozostaje 0
string 4d20+4d10+4d8+2d6 wprowadza 4 do komórki 20, 4 do komórki 10, 4 do komórki 8 i 2 do komórki 6, reszta pozostaje 0

0

W sensie ten string to taka "komenda"?

Podziel go wg plusów i sprawdzaj, czy pierwszy znak to d żeby określić jaką liczbę wprowadzić. Potem zajmij się tym przed i po d. Klasa std::string ma wszystko, czego potrzebujesz.

Edit: patrz niżej i użyj do tego stringstream.

0

Możesz użyć std::istringstream. Zainicjuj go twoim stringiem.

Teraz w pętli while, dopóki wywołanie eof() klasy istringstream będzie zwracało false, możesz za pomocą operatora >> wyciągnąć po kolei wszystkie wartości, tj. obiekt klasy istringstream >> liczba1 >> separator (char) >> liczba2 >> separator.

0
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
	int tab[30] = {0};
	string a,b;
	int x;
	
	cin>>a;
	while(a.find_first_of('+')>=0&&a.find_first_of('+')<a.size())
	{
		b=a.substr(0,a.find_first_of('+'));
		a.erase(0,a.find_first_of('+')+1);
		if(b[0]=='d') tab[atoi(b.substr(1,b.size()-1).c_str())]++;
		else tab[atoi(b.substr(b.find_first_of('d')+1,b.size()-1).c_str())]+=atoi(b.substr(0,b.find_first_of('d')).c_str());
	}
	if(a[0]=='d') tab[atoi(a.substr(1,a.size()-1).c_str())]++;
	else tab[atoi(a.substr(a.find_first_of('d')+1,a.size()-1).c_str())]+=atoi(a.substr(0,a.find_first_of('d')).c_str());
	
	for(int i=0;i<30;i++) cout<<i<<"  "<<tab[i]<<"\n";

	return(0);
}
1

@darkfucker, Jezusmariacotojest?

std::string data = "d20+2d10+d8";
std::istringstream sstream(data);

int numbers[30] = { 0 };

int value, index;
char separator;

while(!sstream.eof())
{
	if(sstream.peek() != 'd')
		sstream >> value;
	else
		value = 1;

	sstream >> separator >> index >> separator;

	numbers[index] = value;
}
0

Dzięki wielkie Rev działa bez zarzutu

0

Mam jeszcze jedno pytanie chcialbym wczytac plik wyglodajacy tak
0 0 0 0 0
2 0 -2 1 1
0 2 3 0 0
-2 6 4 -1 0
-1 3 1 0 -2
1 0 1 0 0
0 4 2 -1 1
1 -4 -3 1 0

(liczba,spacja,liczba,spacja,...)

podobnie jak wcześniej:

fstream plik;
string wiersz;
char separator;
plik.open("modyfikatory.txt",ios::in);
	for(int i=0;i<8;i++)
	{
		int j=0;
		getline(plik,wiersz);
		istringstream sstream(wiersz);
		while(!sstream.eof())
		{
			if(sstream.peek() == ' ')
				sstream >> tab_modyfikatorow[i][j];
			sstream >> separator;
			j++;
		}
	}	
plik.close();

ale wczytuje się tylko część danych:
0 -858993460 -858993460 -858993460 -858993460
2 -858993460 2 -858993460 -858993460
0 -858993460 -858993460 -858993460 -858993460
-2 -858993460 -858993460 1 -858993460
-1 -858993460 -858993460 -858993460 2
1 -858993460 -858993460 -858993460 -858993460
0 -858993460 -858993460 1 -858993460
1 4 3 -858993460 -858993460
nie wiem gdzie tkwi błąd

0

W standardowych strumieniach spacja (i inne białe znaki) jest domyślnym separatorem wobec którego rozdziela się tokeny, nie musisz dodatkowo tej spacji pobierać. Dodatkowo, jeżeli dysponujesz strumieniem od samego początku to czytaj bezpośrednio z niego (plik). Po prostu, po kolei pobieraj liczby przez operator >>, aż do wyczerpania strumienia.

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