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

προβλημα στιν C


K0uR

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

Δημοσ.

παιδια μπορει να με βοηθησει καποιος σε αυτο

printf(give me the password");

char pass[20];

scanf("%s",pass);

if(pass != "kour"){

printf("wrong password");

}

else

printf("u r cool")

}

δεν ξερω γιατι δεν δουλευει σωστα

οτι pass και να βαλω μου βγαζει το ιδιο αποτελεσμα!!!

Δημοσ.

βλεπω πος ολλοι βαζουν ενα &

scanf("%s",&value);

δε ξερω το γιατι

(νομιζω πος ειναι για το out)

Ερωτηση στην ερωτηση

& αυτο δουλευει καπος ετσι?

>
...
//main function
int main(...)
{
 int i=0;
 DoSomething(&i);
 printf(i);
 // το αποτελεσμα θα ειναι 124?
}
void DoSomething(int &i)
{
i=124;
}

Δημοσ.

Φταίει ο τρόπος που κάνεις την σύγκριση.

 

Και το & έιναι για να κάνεις reference, αλλά δεν χρειάζεται εδώ

 

 

>
void doSomething(int *i)
{
i[0]=124;
}

  • Moderators
Δημοσ.

Και το & έιναι για να κάνεις 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)

Δημοσ.

Μονο με 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
Δημοσ.
παιδια λαθος ειναι

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);
// και έχεις αλλάξει το περιεχόμενό της

Δημοσ.

Ρε φιλαράκι το πρόβλημα είναι ότι δεν μπορείς να συγκρίνεις strings με το != ... hence "Φταίει ο τρόπος που κάνεις την σύγκριση."

 

edit: από ότι βλέπω το είπε και ο praetorian.

 

Evgenios, απλά κάτσε και διάβασε pointers και είσαι κυριλέ

Δημοσ.

Το βασικό πρόβλημα είναι ότι η σύγκριση αλφαριθμητικών δεν γίνεται με τον τελεστή != ή == στην C.

Μια σημειωση/διορθωση:

Γινεται σύγκριση αλφαριθμητικών αν προκειται για απλους χαρακτηρες πχ μπορεις να πεις για καποιο a ή a[] που ειναι int ή char:

a!= ' k ' ή a==' \n ' ή a[4] == ' y ' ή a[k] >= ' R ' κλπ....

  • Moderators
Δημοσ.
Μια σημειωση/διορθωση:

Γινεται σύγκριση αλφαριθμητικών αν προκειται για απλους χαρακτηρες πχ μπορεις να πεις για καποιο a ή a[] που ειναι int ή char:

a!= ' k ' ή a==' \n ' ή a[4] == ' y ' ή a[k] >= ' R ' κλπ....

 

"αλφαριθμητικό" και "χαρακτήρας" διαφοροποιούνται ως ορολογία και ως συμβολισμός (διπλα και απλα quotes αντίστοιχα). Σκόπιμα, για να μην προκύπτει μπέρδεμα.

Ένα αλφαριθμητικό "c" δεν είναι το ίδιο με ένα χαρακτήρα 'c'. (Το πρώτο είναι πίνακας χαρακτήρων με 2 στοιχεία, από τα οποία το δεύτερο είναι το '\0' ).

 

Ένας char αντιμετωπίζεται όπως ένας αριθμός. Γι'αυτό ουσιαστικά μπορείς να κάνεις και σύγκριση με <, > , <= , και >= τελεστές, γιατί η C καταλαβαίνει και χρησιμοποιεί τον ASCII κωδικό (αριθμό) του χαρακτήρα που έχεις μέσα στα απλά quote.

 

Θέλω να καταλήξω στο ότι, συνεπώς, έναν χαρακτήρα (char) δεν τον λες ποτέ αλφαριθμητικό.

Δημοσ.
"αλφαριθμητικό" και "χαρακτήρας" διαφοροποιούνται ως ορολογία και ως συμβολισμός (διπλα και απλα quotes αντίστοιχα). Σκόπιμα, για να μην προκύπτει μπέρδεμα.

Ένα αλφαριθμητικό "c" δεν είναι το ίδιο με ένα χαρακτήρα 'c'. (Το πρώτο είναι πίνακας χαρακτήρων με 2 στοιχεία, από τα οποία το δεύτερο είναι το '\0' ).

 

Ένας char αντιμετωπίζεται όπως ένας αριθμός. Γι'αυτό ουσιαστικά μπορείς να κάνεις και σύγκριση με <, > , <= , και >= τελεστές, γιατί η C καταλαβαίνει και χρησιμοποιεί τον ASCII κωδικό (αριθμό) του χαρακτήρα που έχεις μέσα στα απλά quote.

 

Θέλω να καταλήξω στο ότι, συνεπώς, έναν χαρακτήρα (char) δεν τον λες ποτέ αλφαριθμητικό.

OK no problem δεν ξερω την ορολογια στα Ελληνικα για αυτο και το μπερδεμα.:-)

Οποτε αν καταλαβα καλα αλφαριθμητικο λεμε ενα character string(πχ "Ok" ≡ 'O' 'k' '\0') ενω χαρακτηρα λεμε ενα character constant(πχ 'w').

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

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

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