Gå til innhold

[løst] Parse input fra argv


Anbefalte innlegg

Ønsker å sende data til et c-program via argument i kommandolinjen.

Dataene består av flyttall atskilt med et eller flere mellomrom el.

andre tegn. Vil dermed legge alle tallene i en double-array el.

lignende.

Hva er greieste måte å få til dette på? Tenkte kanskje på en smart

bruk av scanf.

Endret av shakur
Lenke til kommentar
Videoannonse
Annonse
Ønsker å sende data til et c-program via argument i kommandolinjen.

Dataene består av flyttall atskilt med et eller flere mellomrom el.

andre tegn. Vil dermed legge alle tallene i en double-array el.

lignende.

Hva er greieste måte å få til dette på? Tenkte kanskje på en smart

bruk av scanf.

 

scanf bør du unngå av flere grunner. Det du vil ha er nok atof eller strtod/strtof.

 

Dersom du virkelig føler for å bruke en *scanf funksjon, så er det sscanf du trenger. Bruk ikke scanf dersom du kan unngå det, den kan sette stdin i en funny state, være svak for buffer overflows og diverse andre morsomme ting. Bruk fgets og sscanf i stedet.

 

Alternativt så kan dette gjøre trikset (Nøye kommentert, og med masse error-checking, bare for deg!)

#include <stdio.h> /* For *printf */
#include <stdlib.h> /* for malloc, free og strtod */
#include <errno.h> /* errno, EINVAL og ERANGE */

int main(int argc, char **argv)
{
/* Allokker minne på heapen. C99 støtter å si double array[argc - 1];
 * men få compilere er 100% konformante enda, så ikke stol på det.
 * argv[0] er navnet på binarien, og det kan vi ikke gjøre om til et tall.
 */
double *array = malloc((argc - 1) * sizeof(*array));
size_t i;
if (array == NULL) { /* Kan ikke allokere minne, skriv noe meningsfylt til stderr
					  * og returner EXIT_FAILURE */
	return EXIT_FAILURE;
} 
for (i = 1; i < argc; i++) {
	if (!(array[i - 1] = strtod(argv[i], NULL)) && errno) {
		/* strtod returnerer 0, og setter errno til EINVAL eller 
		 * ERANGE dersom den feiler, rydd opp her */
		if (errno == ERANGE) /* Overflow eller underflow */
			fprintf(stderr, "Number in argv[%d] could not be represented, errno == ERANGE\n", i);
		if (errno == EINVAL) /* Kunne ikke gjøre argv[i] om til en double */
			fprintf(stdeerr, "Number in argv[%d] is not valid, errno == EINVAL.\n", i);
		/* Dersom det er kritisk, free(array) og returner EXIT_FAILURE her... */
		}
 }

 /* array har nå (forhåpentligvis) argc - 1 doubles */
	 free(array); /* Gi tilbake minnet */
 return EXIT_SUCCESS;
}

 

Edit: Glemte selvfølgelig å inkludere stdio.h...

Endret av qebaba
Lenke til kommentar

Takk for eksempelet qebaba. Denne koden gjør vel alle argumentene

om til double og legger det i arrayen. Jeg er kun interessert i

å ta vare på tallene, derfor tenkte jeg det var greit og bruke

scanf/sscanf.

Programmet skal fungere noe slikt:

./prog "2 , 32, 535 , 12.3" " 43,  3, 3.14 ,5"

Jeg vil dermed parse første og andre argument, ta alle tallene

og legge det i to forskjellige arrayer, slik at:

array1={2,32,535,12.3}

og

array2={43,3,3.14,5}

 

Edit: har løst problemet.

Endret av shakur
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...