Liczby w stringu do tablicy int, parsowanie, HELP !

0

Witam mam problem tego typu, że mam podane przykładowe dane są one rozdzielone spacjami:

string str;
int tab[5];

cin>>str; // za str w oknie wpisujemy "1 -3 23 -10" taki string
//jeśli istieje coś lepszego niż cin chętnie bym się chciał dowidzieć
//czym go zastąpić
zalezy mi na tym, aby każda z tych liczb trafila do tablicy typu int lub do zmiennej np: liczba_1, liczba_2.... :

tab[0]// znalazla sie liczba 1
tab[1]// liczba -3
tab[2]// liczba 23 itd

interesuję mnie również typ float i double ;)

Słyszłem, że do tego stosuje się jakieś parsowanie, lecz nie wiem co to jest, ale się chętnie naucze. Próbowałem cin.getline, ale jedyne co osiągnołem to to że działa taki zabieg dla liczb całkowitych dodatnich, ponieważ usicna mi minus. Czekam na pomoc, jakimś krótkim poradnikiem nie pogardzę pozdowionka ;).

0
#include <iostream>
#include <algorithm>
#include <iterator>
 
using namespace std;
 
int main() {
  size_t count = 0;
 
  cin >> count;
 
  int *tab = new int[count];
 
  copy(istream_iterator<int>(cin), istream_iterator<int>(), tab);
 
  copy(tab, tab + count, ostream_iterator<int>(cout, ", "));
 
  delete [] tab;
        
  return 0;
}

http://ideone.com/yyvWt

Może być tak? Polecam std::vector.

0

Zrobiłem coś takiego. Jeśli chcemy aby w tablicy znalazy się liczby ujemne i dodatnie. To liczba ujemnych musi być parzysta jeśli nie jest to w jedniej z nich obcina znak minus. Dla dodatnich dziala świetnie. Wprowadzane liczby muszą być rozdzielone spacjami. Jak ktoś wie jak to naprawić niech napisze.

#include <iostream>
#include <conio.h>
#include <cstdlib>
using namespace std;

int main(void)
{	
	int tab[20];
	
	int k=0, m=0, ile=0;
	string znaki, temp;
	
	cout<<"Podaj trzy liczby: "<<endl;
	getline(cin, znaki);
	
	for(int i=0; i<znaki.length(); ++i)
	{
			if(znaki[i]!=' ')
			{
				temp[k]=znaki[i];
				++k;
			}
			if(znaki[i]==' ' || i==znaki.length())
			{
				tab[m]= atoi(temp.c_str());
				k=0;
				++m;
				++ile;
			}
	}
	
	for(int i=0; i<ile; ++i)
		cout<<tab[i]<<endl;
	
	
	_getch();
	return 0;
}
0

Wersja trochę mniej na piechotę:

#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

int main()
{        
	vector<int> v;
	int t;
	string znaki;

	cout<<"Podaj x liczb: "<<endl;
	getline(cin, znaki);
	
	istringstream os(znaki);
	while(os >> t)
		v.push_back(t);
		
	for(size_t i=0; i<v.size(); ++i)
		cout<<v[i]<<endl;

	return 0;
}
0

Sprawa konwersji załatwiona. Mam oto program, którego kod jest poniżej. Nie wiem czemu, ale jest dziwny przeskok gdy wprowadzam dane(gdy i==0). A potem pogram zawiesz się. Dlaczego ? I czy sposób jest dobry? Warto kod skompilować i wtedy widzać o co mi chodzi.

#include <iostream>
#include <vector>
#include <sstream>
#include <new>

using namespace std;

struct sStr 
{
	vector<int>wsp;
};

int main(void)
{
	int N=0;
	
	cout<<"Ile prob: ";
	cin>>N;
	
	sStr *test = new sStr [N]; 
	
	for(int i=0; i<N; ++i)
	{
		string znaki;
		int t;
	
		cout<<"Wprowadz liczby: ";
		getline(cin, znaki);
	
		istringstream wylot(znaki);
	
		while(wylot>>t)
			test[i].wsp.push_back(t);	
	}
	
	for(int i=0; i<N; ++i)
	{
		for(int k=0; k<test[i].wsp.size(); ++i)
			cout<<test[i].wsp[k]<<' ';
		cout<<endl;
	}
	
	cin.ignore();	
	return 0;
}
0

Pierwszy problem masz przy wejściu do pętli czytajacej ciągi liczb, przez co czyta się o jeden ciąg mniej niż user chce. W stdin pozostaje nieszczęsna spacja, której pobranie N nie usunęło.

Drugi problem, kaszaniący cały program, jest w pętli wypisującej. O... tutaj:

for(int k=0; k<test[i].wsp.size(); ++i)
0

Aby nie było problemu z pobieraniem N co należy zastosować getline() ? I co jest z tę pętlą nie tak ?

0

Dobra mam to co chciałem. Ostatecznie wygląda to tak. Pozdro i dzięki za pomoc.

#include <iostream>
#include <vector>
#include <sstream>
#include <new>

using namespace std;

struct sStr
{
	vector<int>wsp;
};

int main(void)
{
	int t, N=4;
	string znaki;

	cout<<"Ile prob: ";
	cin>>N;
	
	cin.ignore();
	
	sStr *test = new sStr [N]; 
	
	for(int i=0; i<N; ++i)
	{
		cout<<"Wprowadz liczby: ";
		getline(cin, znaki);
	
		istringstream wylot(znaki);
	
		while(wylot>>t)
			test[i].wsp.push_back(t);
	}

	for(int i=0; i<N; ++i)
	{
		for(int k=0; k!=test[i].wsp.size(); ++k)
			cout<<test[i].wsp[k]<<' ';
		cout<<endl;
	}
	
	cin.ignore();	
	return 0;
}

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