K0uR Δημοσ. 11 Φεβρουαρίου 2009 Δημοσ. 11 Φεβρουαρίου 2009 παιδια μπορει να με βοηθησει καποιος σε αυτο printf(give me the password"); char pass[20]; scanf("%s",pass); if(pass != "kour"){ printf("wrong password"); } else printf("u r cool") } δεν ξερω γιατι δεν δουλευει σωστα οτι pass και να βαλω μου βγαζει το ιδιο αποτελεσμα!!!
Evgenios1 Δημοσ. 11 Φεβρουαρίου 2009 Δημοσ. 11 Φεβρουαρίου 2009 βλεπω πος ολλοι βαζουν ενα & scanf("%s",&value); δε ξερω το γιατι (νομιζω πος ειναι για το out) Ερωτηση στην ερωτηση & αυτο δουλευει καπος ετσι? > ... //main function int main(...) { int i=0; DoSomething(&i); printf(i); // το αποτελεσμα θα ειναι 124? } void DoSomething(int &i) { i=124; }
dark_banishing Δημοσ. 11 Φεβρουαρίου 2009 Δημοσ. 11 Φεβρουαρίου 2009 DoSomething (int *i) Κατά τα άλλα ναι θα τυπώσει 124.
ippo00 Δημοσ. 11 Φεβρουαρίου 2009 Δημοσ. 11 Φεβρουαρίου 2009 Φταίει ο τρόπος που κάνεις την σύγκριση. Και το & έιναι για να κάνεις reference, αλλά δεν χρειάζεται εδώ > void doSomething(int *i) { i[0]=124; }
Moderators Praetorian Δημοσ. 11 Φεβρουαρίου 2009 Moderators Δημοσ. 11 Φεβρουαρίου 2009 Και το & έιναι για να κάνεις reference, αλλά δεν χρειάζεται εδώ Technically, το & σε εκείνη τη θέση στον ορισμό/δήλωση συνάρτησης θα το δεις μόνο στη C++, (όπου και σημαίνει reference). Στη C είναι λάθος να βρίσκεται εκεί σε ορισμό/δήλωση. Στην C το & χρησιμοποιείται για να δώσει την διεύθυνση μιας μεταβλητής, οπότε μπαίνει όταν η παράμετρος που απαιτεί κατα την κλήση της μια συνάρτηση είναι δείκτης (pointer). Αυτό που ονομάζεται "κλήση με αναφορά" (call by reference), και κατά κανόνα χρησιμοποιείται όταν θέλουμε με μια συνάρτηση να αλλάξουμε/επηρεάσουμε το περιεχόμενο μιας μεταβλητής που χρησιμοποιεί το πρόγραμμά μας και εκτός της συνάρτησης. Στην κλήση της scanf, θα χρησιμοποιήσεις το & με μια απλή μεταβλητή (πχ int, char κλπ αλλά όχι πίνακα ή pointer) γιατί το όρισμά της απαιτεί τη διεύθυνση της μεταβλητής (για να αλλάξει το περιεχόμενό της). παιδια μπορει να με βοηθησει καποιος σε αυτο > printf(give me the password"); char pass[20]; scanf("%s",pass); if(pass != "kour"){ printf("wrong password"); } else printf("u r cool") } δεν ξερω γιατι δεν δουλευει σωστα οτι pass και να βαλω μου βγαζει το ιδιο αποτελεσμα!!! Το βασικό πρόβλημα είναι ότι η σύγκριση αλφαριθμητικών δεν γίνεται με τον τελεστή != ή == στην C. Χρειάζεται να χρησιμοποιήσεις ειδικές συναρτήσεις για αλφαριθμητικά όπως η strcmp(char *, char*) (που δηλώνεται στο string.h)
K0uR Δημοσ. 11 Φεβρουαρίου 2009 Μέλος Δημοσ. 11 Φεβρουαρίου 2009 παιδια λαθος ειναι scanf("%s",&pass); και δεν δουλευει
Evgenios1 Δημοσ. 11 Φεβρουαρίου 2009 Δημοσ. 11 Φεβρουαρίου 2009 Μονο με Array ? function(int *i) { int [0]=345; } Ξερω οτι στη C# παει ετσι > public / private void DoSomething(out int i) { i=1; } & public / private void DoSomething(ref int i) { i=new int; i=123; } αλα θελω να μαθω και στη C/C++ το πως γηνεται με ενδιαφερει περισοτερο το ref με τους structs γιατι ειναι πολυ χρησημο(για μενα) πχ struct aStruct { data... }; πως θα το κανω ref ? Πρεπει να εχω pointer ετσι ωστε να ειναι και Array ? void DoSomething(aStruct *str){ str[0]/*???*/ = /*με τι? με new aStruct();*/; ------------------------------------------------------------------------- Θελω να μαθω C++ μονο και μονο για τα WINAPI γιατι με τη C# για να μανατζαρεις ενα κωδικα, θα πρεπει να εχεις μαρατζαρει τουλαχιστον 10 sturcts και ειναι βασανο....
Moderators Praetorian Δημοσ. 11 Φεβρουαρίου 2009 Moderators Δημοσ. 11 Φεβρουαρίου 2009 παιδια λαθος ειναιscanf("%s",&pass); και δεν δουλευει Δεν δουλεύει γιατί δεν είναι σωστό. Το & δεν χρειάζεται εφόσον ο pass είναι πίνακας από char (δηλαδή στην ουσία ένας δείκτης). Το πρόβλημα στον κώδικά σου είναι στη σύγκριση των αλφαριθμητικών. Χρησιμοποίησε την strcmp. > function(int *i) { int [b][0][/b]=345; } Αυτό δεν δουλεύει. Σωστά θα ήταν έτσι: > function(int *i) { [b]i[0][/b]=345; } ή έτσι > function(int *i) { [b]*i[/b]=345; } Με κλήση > int a = 0; function(&a) // to a τώρα έχει τιμή 345 θελω να μαθω και στη C/C++ το πως γηνεται με ενδιαφερει περισοτερο το ref με τους structs γιατι ειναι πολυ χρησημο(για μενα) πχ > struct aStruct { data... }; πως θα το κανω ref ? Πρεπει να εχω pointer ετσι ωστε να ειναι και Array ? > void DoSomething(aStruct *str){ str[0]/*???*/ = /*με τι? με new aStruct();*/; > typedef struct { int member1; int member2; } aStruct; // για να χρησιμοποιείς μόνο το όνομα aStruct για το νέο τύπο/δομή. //συνάρτηση που τροποποιεί το όρισμά της τύπου aStruct, (κλήση με αναφορά) void DoSomething(aStruct *str){ str->member1 = 5; str->member2 = 6; // ή εναλλακτικά: (*str).member1 = 5; (*str).member2 = 6; } ... //κλήση συνάρτησης aStruct str = {0, 0}; DoSomething(&str); // και έχεις αλλάξει το περιεχόμενό της
ippo00 Δημοσ. 11 Φεβρουαρίου 2009 Δημοσ. 11 Φεβρουαρίου 2009 Ρε φιλαράκι το πρόβλημα είναι ότι δεν μπορείς να συγκρίνεις strings με το != ... hence "Φταίει ο τρόπος που κάνεις την σύγκριση." edit: από ότι βλέπω το είπε και ο praetorian. Evgenios, απλά κάτσε και διάβασε pointers και είσαι κυριλέ
Krokodilos Δημοσ. 13 Φεβρουαρίου 2009 Δημοσ. 13 Φεβρουαρίου 2009 Το βασικό πρόβλημα είναι ότι η σύγκριση αλφαριθμητικών δεν γίνεται με τον τελεστή != ή == στην C. Μια σημειωση/διορθωση: Γινεται σύγκριση αλφαριθμητικών αν προκειται για απλους χαρακτηρες πχ μπορεις να πεις για καποιο a ή a[] που ειναι int ή char: a!= ' k ' ή a==' \n ' ή a[4] == ' y ' ή a[k] >= ' R ' κλπ....
Moderators Praetorian Δημοσ. 13 Φεβρουαρίου 2009 Moderators Δημοσ. 13 Φεβρουαρίου 2009 Μια σημειωση/διορθωση: Γινεται σύγκριση αλφαριθμητικών αν προκειται για απλους χαρακτηρες πχ μπορεις να πεις για καποιο a ή a[] που ειναι int ή char: a!= ' k ' ή a==' \n ' ή a[4] == ' y ' ή a[k] >= ' R ' κλπ.... "αλφαριθμητικό" και "χαρακτήρας" διαφοροποιούνται ως ορολογία και ως συμβολισμός (διπλα και απλα quotes αντίστοιχα). Σκόπιμα, για να μην προκύπτει μπέρδεμα. Ένα αλφαριθμητικό "c" δεν είναι το ίδιο με ένα χαρακτήρα 'c'. (Το πρώτο είναι πίνακας χαρακτήρων με 2 στοιχεία, από τα οποία το δεύτερο είναι το '\0' ). Ένας char αντιμετωπίζεται όπως ένας αριθμός. Γι'αυτό ουσιαστικά μπορείς να κάνεις και σύγκριση με <, > , <= , και >= τελεστές, γιατί η C καταλαβαίνει και χρησιμοποιεί τον ASCII κωδικό (αριθμό) του χαρακτήρα που έχεις μέσα στα απλά quote. Θέλω να καταλήξω στο ότι, συνεπώς, έναν χαρακτήρα (char) δεν τον λες ποτέ αλφαριθμητικό.
Krokodilos Δημοσ. 13 Φεβρουαρίου 2009 Δημοσ. 13 Φεβρουαρίου 2009 "αλφαριθμητικό" και "χαρακτήρας" διαφοροποιούνται ως ορολογία και ως συμβολισμός (διπλα και απλα quotes αντίστοιχα). Σκόπιμα, για να μην προκύπτει μπέρδεμα. Ένα αλφαριθμητικό "c" δεν είναι το ίδιο με ένα χαρακτήρα 'c'. (Το πρώτο είναι πίνακας χαρακτήρων με 2 στοιχεία, από τα οποία το δεύτερο είναι το '\0' ). Ένας char αντιμετωπίζεται όπως ένας αριθμός. Γι'αυτό ουσιαστικά μπορείς να κάνεις και σύγκριση με <, > , <= , και >= τελεστές, γιατί η C καταλαβαίνει και χρησιμοποιεί τον ASCII κωδικό (αριθμό) του χαρακτήρα που έχεις μέσα στα απλά quote. Θέλω να καταλήξω στο ότι, συνεπώς, έναν χαρακτήρα (char) δεν τον λες ποτέ αλφαριθμητικό. OK no problem δεν ξερω την ορολογια στα Ελληνικα για αυτο και το μπερδεμα. Οποτε αν καταλαβα καλα αλφαριθμητικο λεμε ενα character string(πχ "Ok" ≡ 'O' 'k' '\0') ενω χαρακτηρα λεμε ενα character constant(πχ 'w').
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.