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

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

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

  • 0
GIANNISPATRA

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

Ερώτηση

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

( int argc , char *argv[] )

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

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

Και επίσης, έλεγχο ισότητας για 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;
}

 

Εναλλακτικά

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Από θεωρητικής απόψεως το ακριβώς ίδιο κάνει και η συνάρτηση strcmp που όλοι γνωρίζουμε ότι είναι ασφαλές. Οι υποψίες σου θα ήταν βάσιμες αν η πηγή των argv δεν εξασφάλιζε την ιδιότητα να είναι strings.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

παράδειγμα atoi (μετατροπή string σε ακέραιο)

 

>
#include <stdio.h>
#include <stdlib.h>

int main(){
char a[]="53";
int aa=atoi(a);
printf("integer=%d",aa);    
return 0;
}

 

μετέτρεψε τα string π.χ. argv[3] σε ακέραιο και μετά κάνε την σύγκριση

επίσης πέρασε τον ακέραιο σαν όρισμα στην συνάρτηση σου.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
παιδια εχω και εγω μια απορεια πανω στο θεμα..

εχω το εξης:

 

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

 

if(argv[3] > 53 || argv[3] < 1){

printf("Invalid integer value\n");

exit(1);

}

 

και

 

shuffleDeck(deck,argv[3]);

 

και δινω στην γραμμη εντολων το εξης:

 

./set4 deck.txt out.txt 10

 

και μου βγαζει προβλημα στο argv[3]:

 

comparison between pointer and integer

και

passing argument 2 of ‘shuffleDeck’ makes integer from pointer without a cast

 

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

 

ευχαριστωωωωωω

 

Θα χαιρωτανε πολυ η κυρα - Βανα να σε βλεπει να λυνεις ασκησεις.Α ρε τι μας κανουν....:P

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
δεν υπάρχει τέτοιο θέμα.

o κώδικας μπορεί να είναι λειτουργικά/αποδοτικά ατελής, αλλά θέμα segmentation fault δεν υπάρχει.

 

π.χ.

>
char c = 3;
if(c==2 && memset((void *)0,0,100)){
         //εσβησα το NULL:shock:
}

:shock:

;)

 

Επίσης αυτό εννοούσα με την δεύτερη παράγραφο του μηνύματός μου. Στο ΣΥΓΚΕΚΡΙΜΕΝΟ παράδειγμα δε θα γινόταν segfault, λόγω της ιδιότητας short circuit των λογικών εκφράσεων στη C (δηλαδή το να γίνονται evaluate ακριβώς μέχρι το σημείο που η γλώσσα είναι σίγουρη για το τελικό αποτέλεσμα) όμως σε οποιοδήποτε άλλο setting θα ήταν επικίνδυνο.

 

Anyway, είμαστε ούτως ή άλλως offtopic

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Απλά αν τρέξεις το πρόγραμμα 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;
}
/*---------------------------------------------------------------------------*/

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
δεν υπάρχει τέτοιο θέμα.

o κώδικας μπορεί να είναι λειτουργικά/αποδοτικά ατελής, αλλά θέμα segmentation fault δεν υπάρχει.

 

π.χ.

>
char c = 3;
if(c==2 && memset((void *)0,0,100)){
         //εσβησα το NULL:shock:
}

:shock:

;)

 

κοίτα και αυτό :)

 

>
int main(void) { return (0 && 1/0); }

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
Ή ένα μονοδιάστατο πίνακα από strings. Μην τον μπερδέψουμε τον άνθρωπο...

Δηλαδή ίδιο πράγμα είναι πάνω κάτω το **argv με το *argv[], όπως και π.χ. το a[] με το *a. Υπάρχουν μόνο κάποιες μικροδιαφορές (δεν μπορείς να αλλλάξεις τη διεύθυνση στην οποία δείχνει ένας πίνακας, με πίνακα η sizeof δίνει το μέγεθος όλων των στοιχείων ενώ με pointer μόνο του pointer).

Δεν υπάρχουνε αυτές οι διαφορες σε function prototype με outmost [].

Γενικά [] είναι incomplete type:

>
#include <stdio.h>
#include <stdlib.h>

struct paradeigma {
 int a;
 char b[]; /* sizeof (paradeigma. einai error */
};

int main(void) {
 struct paradeigma *p = malloc(sizeof paradeigma + sizeof "hello world");
 if(p) {
   strcpy(p->b, "hello world");
   puts(p->;
 }
 free(p);
 return 0;
}

Είναι ένα σωστό πρόγραμμα σε C99 αλλα όχι σε C89.

Σε function declaration, το outmost [] είναι pointer.

>
int f(char str[]);

Το ίδιο με

>
int f(char *str);

Αλλα αυτό ισχύει μονο σε outmost [].

Παράδειγμα:

>
int f(char (*str)[]);

δεν είναι το ίδιο με

>
int f(char *(*str));

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
×
×
  • Δημιουργία νέου...