Pobieanie danych ze stringa

Pobieanie danych ze stringa
  • Rejestracja: dni
  • Ostatnio: dni
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

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
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.

RE
  • Rejestracja: dni
  • Ostatnio: dni
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.

DA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0
Kopiuj
#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);
}
RE
  • Rejestracja: dni
  • Ostatnio: dni
1

@darkfucker, Jezusmariacotojest?

Kopiuj
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;
}
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki wielkie Rev działa bez zarzutu

  • Rejestracja: dni
  • Ostatnio: dni
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

RE
  • Rejestracja: dni
  • Ostatnio: dni
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.