Προς το περιεχόμενο

Option parsing arguments στην C!!


euler

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια χαρα!!

 

εχω ενα προτζεκτ να κανω για την σχολη μου και ενω το εχω ολοκληρωσει σχεδον ολο,αντιμετωπιζω ενα μικρο προβλημα.

η ασκηση λεει οτι η κληση του προγραμματος θα πρεπει να ειναι της μορφης: progname -c C1 C2 -f file1 file2 -o fileoutput

 

οποιος μπορει να μου πως γινεται αυτο γιατι εψαξα και δεν βρηκα τπτ παρομοιο..

μονο την συναρτηση getopt βρηκα αλλαδε ξερω..

 

ευχαριστω

Επισκέπτης
Δημοσ.

Κοίτα η πλήρης σύνταξη της main είναι

>int main(int argc, char* argv[])

Η μεταβλητή argc δείχνει τον αριθμό των ορισμάτων με τα οποία έχεις καλέσει το πρόγραμμα. Να ξέρεις πάντα μετράει και το όνομα του εκτελέσιμου. Δηλαδή στην περίπτωσή σου θες να καλείται το πρόγραμμα με 9 ορίσματα οπότε θα κάνεις έναν έλεγχο στην αρχή αν το argc είναι 9. Μετά κάθε όρισμα αποθηκεύεται ως string στον πίνακα argv. Δηλαδή αν καλέσω το πρόγραμμα ως εξής: progname -c C1 C2 -f file1 file2 -o fileoutput θα αποθηκευτεί στο argv[0] το string progname, στο argv[1] το -c, στο argv[2] το C1,κ.ο.κ.Χρησιμοποίησε αυτές τις πληροφορίες και δε θα ναι πολύ δύσκολο να βρεις τη λύση.

Δημοσ.

>#define OPT_HAS_FILE	(1)
#define OPT_HAS_STAFF	(1<<1)

int options = 0;
char path[MAX_PATH];
int staff = 0;
int main(int argc,char* argv[])
{
int i =0;

if(argc >1)
{
	for(i = 1; i<argc; i+=2)
	{
		if(!strcmp(argv[i],"-file"))
		{
			strcpy(path,argv[i+1]);
			options |= OPT_HAS_FILE;
		}
		else if(!strcmp(argv[i],"-staff"))
		{
			options |= OPT_HAS_STAFF;
			staff = atoi(argv[i+1]);
		}
	}
}
else
{
	printf(
	"options:\n"
	" -file <filename>  set a file\n"
	" -staff <num>\n"
	"      1:           Dosomthing\n"
	"      2:           Dosomthing else\n"

	);
	return 0;
}


if(options & OPT_HAS_FILE)
	printf("file:%s\n",path);
if(options & OPT_HAS_STAFF)
	printf("staff:%d\n",staff);

return 0;
}

 

Αποτελεσμα

>

G:\>test
options:
-file <filename>  set a file
-staff <num>
     1:           Dosomthing
     2:           Dosomthing else

G:\>test -file "g:\test.exe"
file:g:\test.exe

G:\>test -staff 2
staff:2

G:\>test -staff 2 -file "g:\te\te\te\te\e.yy"
file:g:\te\te\te\te\e.yy
staff:2

G:\>test -file "file" -staff 35
file:file
staff:35
G:\>

Δημοσ.

καταρχην ευχαριστω και τους δυο για τια απαντησεις σας.!!

 

καταλαβα περιπου τι πρεπει να κανω,αλλα ο κωδικας του evgenios1 λιγο με μπερδεψε,δεν θα χρησιμοποιησω την συνρτηση getopt?

 

εγω σκεφτηκα κατι με switch και case και με την συναρτηση atoi να περνει το προγραμμα τις τιμες των ακεραιων.

 

αλλα για τα δυο αρχεια δεν ξερω ακομα..

 

αν μπορεις και θελεις εξηγησε μου λιγο τον κωδικα σου..

 

ευχαριστω και παλι!

Δημοσ.

Οπως λεει και ο νικταμιας, το commandline χωριζεται με βαση τα spaces και παιρνανει μεσου του argv (με το 1 στοιχειο το ονομα του exe). Αρα αν το προγραμμα σου παιρνει options τυπου optionName optionValue εσυ πρεπει να βρεις το optionName μεσα στο argv οταν το βρεις θα ξερεις οτι το επομενο ειναι το optionValue

Δημοσ.

ok νομιζω πως καταλαβα ομως με αυτα τι κανεις?

και το |= τι σημαινει?

 

options |= OPT_HAS_FILE;

 

options |= OPT_HAS_STAFF;

Δημοσ.

Αυτά είναι bitwise operations, και στον κώδικα που έδωσε ο Evgenios1 τα χρησιμοποιεί για να [αποθηκεύει σε] και να [ανακτά από] μία μοναδική μεταβλητή (την int μεταβλητή options), περισσότερες από μία παραμέτρους τύπου on-off / true-false.

 

Φαντάζομαι πως η λογική είναι αυτή της εξοικονόμησης μνήμης, αλλά θα μπορούσε η options ακόμη καλύτερα να είναι τύπου char (1 byte), αντί για int, αφού οι παράμετροι δεν είναι τόσες πολλές.

Δημοσ.

ok νομιζω πως καταλαβα ομως με αυτα τι κανεις?

και το |= τι σημαινει?

 

options |= OPT_HAS_FILE;

 

options |= OPT_HAS_STAFF;

http://en.wikipedia.org/wiki/Mask_(computing) Σε περιπτωση που το προγραμμα δεν χρειαζεται ολα τα options για να δουλεψει . (μπορεις να βαλεις απλα BOOL πχ BOOL hasFile,hasStaff,has.... εδιτ με προλαβε ο παρισ)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...