Dzielenie zmiennej po spacjach.

0

Witam. Nie mogę sobie poradzić z pewnym problem (Znowu :( ). Mianowicie mam wczytać liczbę n a potem w jednej linijce mam wczytać n liczby po spacjach które mają powędrować do tablicy. Problem w tym, że nie mam pojęcia jak to zrobić i nic nie mogę znaleźć.
Ma to wyglądać mniej więcej tak.

 
5
1 10 4 40 15
 

Ma to znaleźć się w tablicy tak ably a[0]=1 a[1]=10 itp. Może mi ktoś napisać.

0

w C++ istnieje cos takiego jak strumienie, np. cout albo cin. w szczegolnosci, istnieja strumienie przystosowane do obslugi plikow - ofstream, ifstream
nie wazne czy cin, czy ifstream, i to i to jest strumieniem i uzywa sie tego podobnie.
masz operowac na tekscie, nie na danych binarnych, wiec powinienes uzyc operatora >>, np.:

int zmienna;
cin >> zmienna;

operator (tekstowy) >> ma to do siebie, ze:

  • pomija biale znaki *)
  • da sie go "łancuchowac"

tak wiec, totalna "podstawa" to:

int zmienna1, zmienna2, zmienna...;
cin >> zmienna1 >> zmienna2 >> ....

i to odczyta Ci ciag N kolejnych zmiennych typu INT, oddzielonych spacjami, TAB'ami, nowymi liniami itp.
tak, nowymi liniami. on pomija takze nowe linie. to tez bialy znak.

rozwiazanie Twojego problemu wyglada mniejwiecej tak:

int ilosc;
cin >> ilosc;
liczby = ....przygotuj sobie jakos tablice aby "ilosc" liczb sie zmiescila
for(int i = 0; i < liczby; ...
cin >> liczby[i];

cin mozesz wymienic na ifstream jezeli chcesz czytac z pliku zamiast z "klawiatury"
jest to wersja "minimum", ktora zaklada, ze wszystko sie uda i ze wszystko bedzie zawsze poprawnie podane.

jezeli nie mozesz zalozyc ze dane wejsciowe sa poprawne, tzn. jezeli sam w programie musisz "uwazac" na jakies smieci, czyli ze np. uzytkownik z klawiatury wpisal "mama" zamiast piątki, albo że w pliku wejsciowym byly smieci --- w tym momencie kod sie dosc skomplikuje, poniewaz bedziesz po kazdym >> musial sprawdzac, czy sie operacja odczytu powiodla.
tutaj masz troche informacji o tym: http://4programmers.net/Forum/C_i_C++/161978-C++_Wczytywanie_w._z_rozpoznaniem_czy_wpisano_2_czy_3_licz?hl=cin fail
niestety, nie dokopalem sie do watku w ktorym komus tlumaczylem jak -poprawnie- obslugiwac bledy strumieni..

*) o ile tego nie wylaczysz spacjalnymi manipulatorami

0

Przepraszam zapomniałem dodać, że chodzi mi o czyste c.

0

int zmienna;
cin >> zmienna;

int zmienna;
scanf("%i", &zmienna);

oraz

int zmienna1, zmeinna2;
cin >> zmienna1 >> zmienna2;

int zmienna1, zmienna2;
scanf("%d %d", &zmienna1, &zmienna2);

zwroc uwage, na %i-spacja-%i. spacja oznacza w szablone formatu ze "tutaj maja byc biale znaki", w liczbie dowolnej. jezeli dasz tam na przykald "%d::%d", to wtedy bedzie to oznaczalo dokladnie dwa dwukropki pomiedzy liczbami. tylko spacja/bialeznaki sa "sklejalne do jednego" :)

jezeli potrzebujesz sprawdzac, czy operacja sie powiodla, scanf i fscanf zwracaja liczbe dopasowan ktore odnalazly.
to znaczy, ze jesli wszystko sie udalo, to np.:
scanf("%d", &zmienna) == 1
scanf("%d %d", &zmienna1, &zmienna2) == 2
w sam raz do o'IF'owania i wypisania komunikatu bledu

szablon formatu obsluguje nie tylko %d. musisz dobrac "kod" do tego, jakich zmiennych chcesz uzywac.
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

czasem mozesz spotkac np. szablony formatu zawierajace np. %i zamiast %d. to dlatego, ze czesc bibliotek dorzuca cos-ekstra od siebie. w tym przypadku %i to to samo co %d. ale lepiej uwazac.

0

To wiem ale to nie o to chodzi. Chodzi o to, że tego będzie n, wię dla n=100 mam zrobić takiego olbrzymiego scanf-a ze 100 zmiennymi? I dla każdego innego wypadku będę musiał robić odpowiedniego scanf-a. To mija się z celem. Napiszę przykład o co mi chodzi.
Przykład:
n=10
1 45 32 7 2 21 65 23 7 4

n=3
4 65 54

To co mi pokazałeś niestety tu nie pomoże.

0

Nie. Możesz dać po prostu 1 scanfa po 1 zmiennej. Scanf będzie czytał tak długo jak są jakieś dane w buforze, jak się skończą to wyrzuci EOF.

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

int main(int argc,char**argv)
{
	unsigned int n;
	string strBufor;
	cout<<"Podaj n: ";
	cin>>n;
	cin.ignore(1,'\n') ;
	getline(cin, strBufor) ;
	istringstream iss(strBufor) ;

	int *tab = new int[n] ;
	for(int i=0; i<n; ++i) 
	{
		iss>>tab[i];
	}
	
	cout<<"Sprawdzenie:\n" ;
	cout<<"Liczby:\n\t" ;
	for(int i=0; i<n; ++i)
	{
		cout<<tab[i]<<" " ;
	}
	cout<<"\n";
	cout<<"Bufor:\n\t"<<strBufor<<"\n";
	
	delete [] tab;
	
	return 0;
}



Podaj n: 6
3     -6 	102 2 2   -0
Sprawdzenie:
Liczby:
	3 -6 102 2 2 0 
Bufor:
	3     -6 	102 2 2   -0
0
int ile;
int *a;
scanf("%d",&ile);
a=(int*)malloc(ile*sizeof(int));
for(int i=0;i<ile;++i) scanf("%d",a+i);

for(int i=0;i<ile;++i) printf("a[%d]=%d;\n",i,a[i]);

free(a);
0

@snevill jeśli nie opanowałeś jeszcze pętli to odpuść sobie próby pisania czegokolwiek i się wreszcie naucz podstaw...

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