Rozebrání pole a nastavení parametrů v programu [C]

C,C++,C#

Moderátori: psichac, Moderátori

blazenabc
Stály člen
Stály člen
Príspevky: 102
Dátum registrácie: 16 Nov 2014, 10:41

Rozebrání pole a nastavení parametrů v programu [C]

Príspevok od používateľa blazenabc » 28 Dec 2014, 11:01

Dobré dopoledne,

Dovolte mi otázku. Mám pole, které obsahuje data set od 0 do 10 a za nimi vždy následují data od 0 do 200;
například:
set1 10
nebo
set3 120


kde "set" značí co nastavuji a čislo za tím udává, na co potřebuji nastavit (třeba výstup), vždy ukončené \n.

Ale není mi jasné, jak z toho vybrat první část a druhou číst. Obojí je ke všemu ve formě string.

Takže musím z pole vyextrahovat pole[0]~pole[3], sloučit a porovnat se stringem. Toto by ještě šlo.

Ale jak vyexportovat ten zbytek nevím. Proto jestli někdo víte, určitě uvítám jakékoli nakopnutí. Děkuji

-- Spojený príspevok 28 Dec 2014, 12:46 --

Tak už jsem trošku pokročil. Ještě to není dobře, mám tam chybu:

deklarace

Kód: Vybrať všetko

char pole[128];	char pom_pole[128];	char string[6];
Jelikož vím vstupní část dat, tak můžu psát:

Kód: Vybrať všetko

// na seriovku posle prijaty retezec  
        uart_puts(pole);  
//vyeportovani prvniho stringu
	pom_pole[0] = pole[0]; 
	pom_pole[1] = pole[1];
	pom_pole[2] = pole[2];
	pom_pole[3] = pole[3];
	pom_pole[4] = '\0';
	strcpy(string, pom_pole);
	sprintf(buffer, "string: %s\n", string);
	uart_puts(buffer);  

	//vyeportovani cisla
	pom_pole[0] = pole[5]; 
	pom_pole[1] = pole[6];
	pom_pole[2] = pole[7];
	pom_pole[4] = '\0';
	strcpy(string, pom_pole);
	sprintf(buffer, "string: %s\n", string);
	uart_puts(buffer);  
Zatím to je ve formátu string, ale až vyřeším tento problém, budu pokračovat dál.

A výstup z terminálu je správný až na tu hloupou jedničku, kterou mi vrací a nevím proč.
Obrázok
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Rozebrání pole a nastavení parametrů v programu [C]

Príspevok od používateľa peterple » 28 Dec 2014, 11:46

Ak sa stým nechceš moc piplať tak napríklad takto:

Kód: Vybrať všetko

	char pole[]="set10 199\n";
	int index;
	int hodnota;
	int parcount;
	parcount= sscanf(pole, "set%d %d",&index, &hodnota);
v premennej parcount máš počet extrahovaných parametrov.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

blazenabc
Stály člen
Stály člen
Príspevky: 102
Dátum registrácie: 16 Nov 2014, 10:41

Re: Rozebrání pole a nastavení parametrů v programu [C]

Príspevok od používateľa blazenabc » 28 Dec 2014, 11:55

Jééééžiš šmarjááááá. A já se s tím tak drbu.

Na tu funkci sscanf jsem úplně zapomněl. použil jsem ji snad jednou v životě. Teď tedy podruhé. :-D

Dík moc
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Rozebrání pole a nastavení parametrů v programu [C]

Príspevok od používateľa peterple » 28 Dec 2014, 11:55

vidím že sa chceš piplať. Máš tam ale zopár nedomysleností a je je totálne neefektívne. Takže prý string kopíruješ na tvrdo iba 4 znaky, Ale on môže mať aj 5. to v prípade že máš set10.
Tá jednotka čo tam máš bude asi nejako súvisieť s tým že ten druhý krát patrí ukončenie stringu na pozíciu 3 a nie 4 ako si pri kopírovaní zabudol zmeniť.

-- Spojený príspevok 28 Dec 2014, 13:00 --

Ešte nechápem načo robíš v tom tvojom programe

Kód: Vybrať všetko

 strcpy(string, pom_pole);
veď pom_pole je string.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

martin63
Ultimate člen
Ultimate člen
Príspevky: 1738
Dátum registrácie: 11 Máj 2008, 00:00
Bydlisko: Námestovo
Vek: 34

Re: Rozebrání pole a nastavení parametrů v programu [C]

Príspevok od používateľa martin63 » 28 Dec 2014, 12:45

Ako píše kolega vyššie, ten strcpy je tam zbytočný. Akurát, že ti bude platiť, len pre štyri znaky, čo nieje veľmi dobré. Ono v princípe by si mal všetko robiť tak, že vlastne nevieš, koľko znakov budeš prijímať, ale vieš, čo bude na konci prijatého stringu. Ak posielaš string cez terminál, tak na konci je vždy 0x0D alebo by aspoň malo byť. Takže by si mal všetky bajty, až po posledný (0x0D) ukladať. A takto budeš mať uložený kompletný string a je jedno, či bude mať tri, štyri alebo päť znakov.

K úprave tvojho riešenia:

a ak si prídaš, ešte toto

Kód: Vybrať všetko

pom_pole[5] = '\n';
tak aj sprintf je zbytočný.
0

blazenabc
Stály člen
Stály člen
Príspevky: 102
Dátum registrácie: 16 Nov 2014, 10:41

Re: Rozebrání pole a nastavení parametrů v programu [C]

Príspevok od používateľa blazenabc » 28 Dec 2014, 12:53

Ano toto jsem opravil a už to funguje:

Kód: Vybrať všetko

//vyeportovani prvniho stringu
			   pom_pole[0] = pole[0]; 
			   pom_pole[1] = pole[1];
			   pom_pole[2] = pole[2];
			   pom_pole[3] = pole[3];
			   pom_pole[4] = pole[4];
			   pom_pole[5] = '\0';
			   sprintf(buffer, "string: %s\n", pom_pole);
			   uart_puts(buffer);  

			   //vyeportovani cisla
			   pom_pole[0] = pole[5]; 
			   pom_pole[1] = pole[6];
			   pom_pole[2] = pole[7];
			   pom_pole[3] = pole[8];
			   pom_pole[4] = '\0';
			   sprintf(buffer, "string: %s\n", pom_pole);
			   uart_puts(buffer);

Teď už jen to číslo předělat ze string na int a je to. Ale to bych mohl zvládnout. ;)

Kód: Vybrať všetko

int result = atoi(pom_pole);
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Rozebrání pole a nastavení parametrů v programu [C]

Príspevok od používateľa peterple » 28 Dec 2014, 13:12

v takom prípade ti je celé pomocné pole na nič. Stačí

Kód: Vybrať všetko

index=atoi(&pole[3])
Potom si nájsť oddeľovaciu medzeru a znova to isté pre hodnotu od nasledovnej pozície.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok