Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Komentoriviparametrit C:ssä

AGulak [26.10.2006 11:55:06]

#

Moikka. Oon tässä aloitellut C-ohjelmointia ja olen tehnyt monenlaisia "perinteisiä" harjoituksia, eikä niissä ole ollut mitään isompia ongelmia.
Nyt kuitenkin kun pitäisiä toimia komentoriviparametrien avulla, ei mikään tahdo onnistua.

Ajatuksena olis tehdä ohjelma joka kerää tietoja käyttäjästä ja tallentaa ne tiedostoon. Ohjelmassa on myös mahdollisuus poistaa tietoja käyttäjän ID:n perusteella, järjestellä listattuja henkilöitä perheen lkm mukaan jne.

esimerkki komento:
/ohjelma -h "Matti" -p"4", voisi olla yksi komento, jossa '-h' tarkoittaa "lisää henkilö", jonka jälkeen tulis nimi. Sitten '-p' tarkoittaisi perheen kokoa, eli esim lkm "1-5". Ja kaikki tämä sitten vielä tiedostoon, vaikka tekstimuodossa.

Osaan tunnistaa alussa onko parametri oikein esim.'-h', mutta sen jälkeen onkin vaikeaa.

Suurin ongelma on kuitenkin tietojen luku ja komentoriviparametrin tutkiminen ja oikein toimiminen.

Toivottavasti joku jaksoi lukea, kiitos paljon etukäteen!

Metabolix [26.10.2006 13:49:13]

#

Jokseenkin näin:

#include <string.h>
#include <stdio.h>

void lisaa_henkilo(const char *nimi, int perheen_koko);
/* Sen saat tehdä itse. :) */

int hoida_komentorivi(int argc, char ** argv)
{
	int henkilo_tulossa = 0; /* Onko jo ollut -h */
	char * nimi;
	int perheen_koko;

	/* Käydään kaikki läpi */
	for (i = 1; i < argc; ++i) {
		/* Katsotaan, mikä parametri tulee */
		if (strcmp(argv[i], "-h") == 0) {
			/* Kas, -h, lisätään henkilöä. */
			/* Jos oli jo tulossa, hoidetaan se loppuun. */
			if (henkilo_tulossa) {
				lisaa_henkilo(nimi, perheen_koko);
			}
			henkilo_tulossa = 1; /* Nyt ainakin on tulossa. */
			perheen_koko = -1;   /* Ei tiedätä */
			nimi = argv[i + 1];  /* Otetaan osoitin nimeen */
			/* Seuraava ohitetaan, koska se on nimi. */
			++i;
		} else if (strcmp(argv[i], "-p") == 0) {
			/* -p, perheen koko */
			/* Jos ei ole henkilöä tulossa, virhe */
			if (!henkilo_tulossa) {
				goto virhepalautus;
			}

			/* Muuten luetaan se perheen koko seuraavasta parametrista. */
			sscanf(argv[i + 1], "%i", &perheen_koko);
			/* Seuraava ohitetaan, koska se juuri luettiin. */
			++i;
		} else {
			/* Viallinen parametri, kun ei tunnistettu */
			goto virhepalautus;
		}
	}

	/* Jos oli henkilö kesken, lisätään se. */
	if (henkilo_tulossa) {
		lisaa_henkilo(nimi, perheen_koko);
	}

	/* Palautetaan 0, onnistui. */
	return 0;

virhepalautus:
	/* Palautetaan i, kun tuli kummallinen parametri siinä kohti. Tässä vaiheessa olisi ehkä hyvä tutkia, mikä siinä oli vikana. */
	return i;
}

int main(int argc, char ** argv)
{
	int palautus = hoida_komentorivi(argc, argv);
	if (palautus != 0) {
		printf("Komentorivi oli viallinen! %i. eli '%s' ei kelpaa!\n", palautus, argv[palautus]);
	}
	return 0;
}

Näin nyt pikaisesti hyppytunnilla ajatellen, voipi olla virheitäkin seassa, kun ei ollut kääntäjää käsillä. Kysy toki lisää. :) Kysymyksesi oli sen verran epämääräinen (ts. laaja), että vaikea siihen on tarkasti vastata. Voisit vielä selventää, mikä kohta tutkimisessa on ongelma.

AGulak [26.10.2006 19:29:59]

#

Joo kiitos.

Tästä on jo jotain apua, ainakin vähän uusia ajatuksia heräs tämän myötä. Mietiskelen ja kokeilen itsekseni ja kyselen sitten lisää myöhemmin jos aihetta on ja yritän esittää kysymyksen täsmällisemmin seuraavalla kerralla.

Kiitos kyn uhrasit hypärin tämän takia ;)

_Pete_ [03.11.2006 09:53:12]

#

Ja jos ei välttämättä halua keksiä pyörää uudestaan voi käyttää valmiita kirjastoja jotka hanskaavat homman. Tässä yksi esimerkki:

http://argtable.sourceforge.net/

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta