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

τι είναι τα argc και argv στη C


GIANNISPATRA

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

Δημοσ.

Χαιρετώ λοιπόν έχω ψάξει όλο το ίντερνετ να μου δώσει έναν κατατοπιστικό οδηγό για να καταλάβω τι είναι οι δύο παράμετροι που βάζουμε στη main

( int argc , char *argv[] )

Μπορεί να μου εξηγήσει κάποιος τι κάνουνε ??

Κάτι για γραμμή διαταγών κλπ ..λέει δεν καταλαβαίνω τίποτα όμως...

 

Ευχαριστώ εκ'των προτέρων ..

  • Απαντ. 30
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

το argc (η πρωτη παραμετρος) ειναι ενας ακεραιος που δειχνει τον αριθμο των διαθεσιμων ορισματων γραμμης εντολων. το επομενο (char* argv[]) πως βλεπεις απο τον ορισμό του ειναι μια διαταξη δεικτων προς συμβολοσειρες. argv[1],argv[2] θα ειναι αντιστοιχα το πρωτο κια το δευτερο ορισμα που θα εισαγεις εσυ μεσω γραμμης εντολων μετα το ονομα του εκτελεσιμου. επισης μπορεις να δωσεις οτι ονοματα θελεις εσυ τα argc kai argv δεν ειναι στανταρ

Δημοσ.

ναι δεν καταλαβαίνω όμως πως τα χρησιμοποιούμε .... δηλαδή τι είναι τα διαθέσιμα ορίσματα γραμμής εντολών και και το γιατί να χρησιμοποιήσω argv αντί για gets ?

sorry αλλά τα έχω μπερδέψει λίγο ...

Δημοσ.

η εισαγωγή των strings με την gets γίνεται κατά τη διάρκεια εκτέλεσης του προγράμματος, ενώ όταν χρησιμοποιείς τα ορίσματα της γραμμής εντολών argc-argv, (από την κονσόλα δηλαδή) τότε τα strings εισάγονται με την έναρξη της εκτέλεσης, όταν δηλαδή καλείται η main.

Δημοσ.

ναι , επισης να θυμασαι πως στο argv[0]

παντα αποθηκευεται μια τιμη (ονομα του προγραμματος νομιζω), οποτε διαβασεις τα ορισματα σου απο κει και περα, και συνεπως το argc ειναι παντα >=1

  • 2 εβδομάδες αργότερα...
Δημοσ.
Χαιρετώ λοιπόν έχω ψάξει όλο το ίντερνετ να μου δώσει έναν κατατοπιστικό οδηγό για να καταλάβω τι είναι οι δύο παράμετροι που βάζουμε στη main

( int argc , char *argv[] )

Μπορεί να μου εξηγήσει κάποιος τι κάνουνε ??

Κάτι για γραμμή διαταγών κλπ ..λέει δεν καταλαβαίνω τίποτα όμως...

 

Ευχαριστώ εκ'των προτέρων ..

 

Απλά αν τρέξεις το πρόγραμμα test.exe ως εξής:

 

test myfile.tst -a -h -b

 

Τότε το argc θα είναι ίσο με 4 (πλήθος παραμέτρων) και το argv:

argv(0) θα έχει την τιμή "myfile.tst"

argv(1) θα έχει την τιμή "-a"

argv(2) θα έχει την τιμή "-h"

argv(3) θα έχει την τιμή "-b"

Δημοσ.
Απλά αν τρέξεις το πρόγραμμα test.exe ως εξής:

 

test myfile.tst -a -h -b

 

Τότε το argc θα είναι ίσο με 4 (πλήθος παραμέτρων) και το argv:

argv(0) θα έχει την τιμή "myfile.tst"

argv(1) θα έχει την τιμή "-a"

argv(2) θα έχει την τιμή "-h"

argv(3) θα έχει την τιμή "-b"

 

Περίπου (πρόσεξε τι έγραψε παραπάνω ο System), το argv[0] υποδεικνύει την πλήρη διαδρομή εκκίνησης της εφαρμογής (τουλάχιστον σε DOS & Windows compilers), δηλαδή στην περίπτωση του test το argv[0] = test.exe, οπότε:

 

>
argv(0) θα έχει την τιμή test.exe
argv(1) θα έχει την τιμή "myfile.tst"
argv(2) θα έχει την τιμή "-a"
argv(3) θα έχει την τιμή "-h"
argv(4) θα έχει την τιμή "-b"

 

Το παρακάτω πρόγραμμα (σε C/C++ Builder 6.0 -ANSI C mode), επιστρέφει το argc/argv που εισάγει ο χρήστης (μαζί με το argv[0] που παρέχεται από το Σύστημα).

 

>
/*-ARGC/ARGV LIST Directx----------------------------------------------------*/
#include <stdio.h>
#ifdef __BORLANDC__
   #pragma hdrstop
#endif

/*---------------------------------------------------------------------------*/
#ifdef __BORLANDC__
   #pragma argsused
#endif
int main(int argc, char* argv[])
{
   int nArgc;
   for(nArgc=0;nArgc<argc;nArgc++)
       printf("argv[%d] = %s\n",nArgc,argv[nArgc]);

   printf("Press Enter to resume..");
   getchar();

   return 0;
}
/*---------------------------------------------------------------------------*/

Δημοσ.

Ευχαριστώ για την διόρθωση. Τελευταία φορά που μου είχε χρειαστεί ήταν πριν από 7-8 χρόνια και αρχίζω να ξεχνάω. Καταραμένα γεράματα.

  • 4 μήνες μετά...
Δημοσ.

Συγγνώμη που ξεθάβω το θέμα, αλλά έχω μια απορία πάνω σε αυτό το θέμα και είπα να το συμπληρώσω από το να ανοίγω νέο τόπικ.

Προσπαθώ να φτιάξω μια εντολή για minix σε C και θέλω από έναν δισδιάστατο argv τύπου char να διαβάζω μια παράμετρο μιας εντολής (πχ. command -a),αλλά δε μου βγαίνει και μάλλον συμβαίνει γιατί αγνοώ κάτι στη σύνταξη της argv.Στον κώδικά μου το δηλώνω:

main(int argc,char **argv)

 

κι έχω προσπαθήσει να διαβάσω στην If την παράμετρο στον argv είτε:

if (argv[1][0] = '-a')

είτε

if (argv[1] = '-a')

είτε

if (argv[2] = '-a')

είτε

if (argv[1][0] = '-''a')

αλλά με καμία δε μου δούλεψε στην εκτέλεση.

Η εκτέλεση σκέτου του command πάντως δουλεύει.

Μήπως γνωρίζει κανείς πως πραγματικά πρέπει να γίνει η σύνταξη? Ευχαριστώ προκαταβολικά!

Δημοσ.

Και επίσης, έλεγχο ισότητας για strings κάνεις με την strcmp. Το "-a" δεν είναι ένας χαρακτήρας μόνο, για να αποθηκεύεται στο argv[1][0]...

Δημοσ.

Νομίζω ότι όταν δηλώνεις συμβολοσειρά και όχι χαρακτήρα μετά τη μεταβλητή βάζεις "[ ]"....Δηλαδή έτσι

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

Για το δυσδιάστατο δε νομίζω ότι γίνεται κάτι τέτοιο και δε βλέπω να υπάρχει και νόημα...

 

Στη σύγκριση που κάνεις δυο σημβολοσειρών στην ουσία, δεν νομίζω ότι λειτουργεί έτσι.. χρειάζεται την strcmp που το κάνει αυτό..Δηλαδή αποθηκεύεις το -α κλπ σε μια μεταβλητή και μετά τα συγκρίνεις με την argv έτσι..:

if (strcmp(password, argv[κάτι]) =0) {....

αν δηλαδή είναι ίσα τότε μπαίνει στην if...

αρχάριος είμαι αλλά ελπίζω να βοήθησα....

 

 

edit με πρόλαβαν..!

Δημοσ.

>
#include <stdio.h>

int
main(int argc, char **argv)
{	if(argc>1)
	if((argv[1][0] == '-') && (argv[1][1] == 'a') && (argv[1][2] == '\0'))
		printf("Correct Argument\n");	
return 0;
}

 

Εναλλακτικά

Δημοσ.

το = αντί για == ήταν τυπογραφικό λάθος που έγινε όταν έγραφα το ποστ και το οποίο αναπαράχθηκε με τα copy - paste που έκανα και δεν το παρατηρήσα. Οι παρατηρήσεις και οι συμβουλές σας όμως ήταν πολύ χρήσιμες. Και η συμβολή για το strcmp που έχω δει και σε άλλα sources του minix να χρησιμοποιείται και και ο κώδικας του ippo. Το char **argv όμως έχω δει σε διάφορες main -τουλάχιστον στο Minix- να δηλώνεται έτσι. Χωρίς [].Τα δοκιμάζω και στην πράξη και ξαναποστάρω για το ποιον κώδικα χρησιμοποίησα τελικά. Σας ευχαριστώ όλους!

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

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

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