» »

[C] Razbitje stringa s pomočjo indeksov

[C] Razbitje stringa s pomočjo indeksov

drVrh ::

Pozdravljeni,

ne znam dobiti iz string-a samo določene številke na izbranem indeksu.
Primer:
Iz str[] razbijem dani string na več manjših stringov, ki je polju char * array[15];

		char str[] ="$GPGGA,124845.45,4124.8963,S,11151.6838,E,1,05,1.5,280.2,M,-34.0,M,,,*75";
		char * pch;  
		printf ("Splitting string \"%s\" into tokens:\n",str);
		pch = strtok (str,",$");
	  while (pch != NULL)
	  {
		printf ("Direktno: %s\n");
		array[i++] = pch;
		printf ("%s\n",pch);
		pch = strtok (NULL, ",$");				
	  }

		for(i = 0; i < 15; ++i){
			printf ("Iz polja: %s\n");
			printf("%s\n", array[i]);
		}


Za tem želim iz char array[1]; želim dobiti ven številke, v tem array[1] je shranjen čas v obliki 1248.65, tu ven želim dobiti prvo prvi številke potem drugi dve ostalo pa zbrisati. Torej da bom imel 12 in 48, ki bom lahko izpisal 12:48
Sedaj delam to tako:

	char time[2];
	
	printf("%s\n", array[1]);
	strncpy(time, array[1], 2);
	printf("%s\n", time);



Izpis tega je:
124845.45
12t&#9632;a

To ni najbolj optimalna rešitev, zanima me ali obstaja kakšna boljša in lažja rešitev?
  • spremenil: drVrh ()

Shinobi ::

Zdravo!

Najbolj optimalno ti je regex expression, ce delas za Windowse.
Problem si opisal zelo nerazumljivo. Jaz mislim, da ti beres,
vrstico po vrstico iz datoteke, vsaka vrstica pa ima parametre
locene z vejico, kar je cisto navadna CSV datoteka (excel).

Ce je to res, je tvoja zasnova napacna. Ti si string tokenizerju
podal znak '$' kot locilo, kar pa ni res, locilo je dejansko
vejica ','.

Najbolj enostavno bi bilo, da clovesko poves kaj bi sploh rad.
Povej to je ena od vrstic. Ta vrstica vsebuje koordinate in
jaz potrebujem to in ono. Pa ti bomo lazje pomagali.

Ce ima string vrednost 124845.45 ti pa potrebujes 12 in 48
to nima nobenega smisla. Kaj ce bi imel vrednost 0.12 ?

prtenjam ::

Pozdravljen,

Ah, zakaj preglejuješ celoten niz, če potrebuješ samo podatke, ki sledijo prvi vejici... Tvoja koda in podobna koda, ki bere celoten niz nikakor ne more biti optimalna. Če te zanimajo znaki za prvo vejico, potem beri samo do prve vejice in potem naslednje 4 znake.

nekaj takšnega torej (lahko da je kakšna shematnična napaka, ker pišem kar iz glave=):
  char str[] ="$GPGGA,124845.45,4124.8963,S,11151.6838,E,1,05,1.5,280.2,M,-34.0,M,,,*75";

  // najdeš prvo vejico
  char *ptr = str;
  while (*ptr != ',') ++ptr;

  // sedaj se nahajaš na vejici in semo izpiši naslednje 4 zanke
  printf("%c%c:%c%c", *(ptr + 1), *(ptr + 2), *(ptr + 3), *(ptr + 4));
Matjaž Prtenjak
https://mnet.si

drVrh ::

Noter v program, dobim takšno obliko:
$GPGGA,124845.45,4124.8963,S,11151.6838,E,1,05,1.5,280.2,M,-34.0,M,,,*75

ta stavek moram jaz razbit na manjše, da bom do teh podatkov lahko dostopal kadarkoli, v tem stavku NMEA nosim na začetku uro, v tem primeru je zapisano 124845.45 prvi dve številki sta ura drugi dve minute in ostalo sekunde. Jaz rabim samo prve štiri, ki bi jih kasneje še razbil na prvi dve da dobim uro in drugi dve da dobim minute. Vse to mora biti v string tipu da lahko prikažem na grafičnem lcd na vgrajenem sistemu.

Za nadaljni prikaz koordinat ki sledijo uri, jaz lahko dostopam v zgornjem programu preko array[indeks] in indeksa ki ga vpišem, tiste koordinate so v pravilni obliki in ne rabim z njimi nič delati le prikazati torej nekako takole:
LCD_Puts(array[2]);

Zgodovina sprememb…

  • spremenil: drVrh ()

Invictus ::

Regex:

extract( var, "\$\S*,(\d{2})(\d{2})\.\d*,.*")

Ne rabiš nič razbijat na polja. Brez zveze.

Regexi so malo odvisni od implementacije. Preveri v dokumentaciji.
"Life is hard; it's even harder when you're stupid."

http://goo.gl/2YuS2x

Zgodovina sprememb…

  • spremenil: Invictus ()

Shinobi ::

Vec opcij. Najbolj hekerska:

char* data = "$GPGGA,124845.45,4124.8963,S,11151.6838,E,1,05,1.5,280.2,M,-34.0,M,,,*75";
int nHours = -1;
int nMinutes = -1;
sscanf(data + 7, "%2d", &nHours);
sscanf(data + 9, "%2d", &nMinutes);


Malo bolj razumljiva:
char* data = "$GPGGA,124845.45,4124.8963,S,11151.6838,E,1,05,1.5,280.2,M,-34.0,M,,,*75";
char szOutput[256];
char szTemp[256];
szOutput[0] = szTemp[0] = 0;
sscanf(data, "%[^,],%[^,]", szTemp, szOutput);
char szHours[3] = { '0', '0', 0 };
char szMinutes[3] = { '0', '0', 0 };
strncpy(szHours, szOutput, 2);
strncpy(szMinutes, szOutput+2, 2);
int nHours = atoi(szHours);
int nMinutes = atoi(szHours);

Zgodovina sprememb…

  • spremenil: Shinobi ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] Kazalčna aritmetika

Oddelek: Programiranje
292731 (1512) blay44
»

C - shranjevanje rezultatov iz baze v array

Oddelek: Programiranje
71134 (833) Randomness
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
656743 (5816) MrBrdo
»

[C++] Stack corrupted? Memory allocation f****p?

Oddelek: Programiranje
141249 (1016) BigWhale
»

Pointer-ji v C-ju

Oddelek: Programiranje
291683 (1381) rokpok

Več podobnih tem