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

τι είναι τα 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;
}
/*---------------------------------------------------------------------------*/

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 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 πάντως δουλεύει.

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

 

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

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

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

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

 

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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


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