shakur Skrevet 16. januar 2008 Skrevet 16. januar 2008 (endret) Ø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 16. januar 2008 av shakur
qebaba Skrevet 16. januar 2008 Skrevet 16. januar 2008 (endret) Ø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 16. januar 2008 av qebaba
shakur Skrevet 16. januar 2008 Forfatter Skrevet 16. januar 2008 (endret) 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 16. januar 2008 av shakur
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå