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

compare 2 string in a structure


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

Δημοσ.

Γεια σας συμφορουμιτες!

Θα ηθελα τα φωτα σας!φτιαχνω ενα προγραμματακι και θελω να κανει το εξης:

θα δινω ενα string και θα το συγκρινω με ενα ονομα που βρισκεται μεσα σε ενα structure!Δοκιμασα αρκετα πραματα αλλα δεν απεδωσαν καρπους =/

 

>printf("Dwse to Last Name pou psaxneis:\n");
     fgets(x,20,stdin);
     printf("\n%s", x); //ektupwnei to string
     if(x==data.lname)//to prwto pou dokimasa 
     if(ret==strcmp(x, data.lname)) //2o 

Ισως ειμαι και τελειως εξω απο αυτο που ειναι στην πραγματικοτητα!Καποιος να δωσει τα φωτα του???

 

Ευχαριστω

Δημοσ.

Σύγκριση δύο string κάνει η συνάρτηση strcmp() όπου αν είναι ίσα επιστρέφει 0 αν το πρώτο όρισμα είναι αλφαβητικά μικρότερο απο το δεύτερο επιστέφει -1 και να το πρώτο όρισμα είναι αλφαβητικά μεγαλύτερο απο το δεύτερο επιστέφει 1.

 

Δηλαδή για να δείς αν είναι ίσα:

 

>if(0==strcmp(x, data.lname)) 

Δημοσ.

Λοιπον επειδη τα strings (οπως εχει καταλαβει) ειναι πινακες δεν γινετε να συγκκρινουμε ολοκληρο μπλοκ μνημης με ενα if (εξαλλου το x που βαζεις στην ουσια ειναι η θεση του πρωτου στοιχειου του πινακα, κι οχι ολος ο πινακας), για αυτο χρησιμοποιουμε την strcmp() η οποια επιστρεφει 0 (μηδεν) οταν τα δυο strings ειναι ιδια. Οποτε εσυ γραψε κατι τετοιο:

>if(strcmp(x, data.lname) == 0)
{
   . . . 
}

Δημοσ.

Λοιπον επειδη τα strings (οπως εχει καταλαβει) ειναι πινακες δεν γινετε να συγκκρινουμε ολοκληρο μπλοκ μνημης με ενα if (εξαλλου το x που βαζεις στην ουσια ειναι η θεση του πρωτου στοιχειου του πινακα, κι οχι ολος ο πινακας), για αυτο χρησιμοποιουμε την strcmp() η οποια επιστρεφει 0 (μηδεν) οταν τα δυο strings ειναι ιδια.

 

Δεν έχω κάτι να προσφέρω στη συζήτηση, αλλά technically τα strings δεν είναι πίνακες. Μπορεί οι πίνακες να κάνουν decay σε char*, όμως όσον αφορά τον compiler άλλο type είναι το char[] και άλλο το char*.

Δημοσ.

Δεν έχω κάτι να προσφέρω στη συζήτηση, αλλά technically τα strings δεν είναι πίνακες. Μπορεί οι πίνακες να κάνουν decay σε char*, όμως όσον αφορά τον compiler άλλο type είναι το char[] και άλλο το char*.

 

Συντακτικα ειναι το ιδιο (και πρακτικα)

Δημοσ.

@nilos: πρακτικά δεν είναι το ίδιο... τα char[ length] δεν μπορούν να χρησιμοποιηθούν απευθείας ως lvalues, όπως δεν μπορούν και τα char * = "" (string literals)

Δημοσ.

Συντακτικα ειναι το ιδιο (και πρακτικα)

 

Βασικά δε με ενδιαφέρει να μπω σε συζήτηση/διαφωνία γιατί α) ξέρω πως έχω δίκιο και β) παλιότερα είχα και γω την ίδια παρανόηση που έχεις και συ τώρα.

 

Αλλά έτσι για το χαβαλέ: αυτό που λες ότι "είναι το ίδιο", το λες απλά για να επιμείνεις στην προηγούμενη άποψή σου ή υπάρχει και κάποιο επιχείρημα;

 

EDIT:

 

Για παράδειγμα, δοκίμασε να κάνεις compile αυτό και δες που βγάζει error και πού δεν βγάζει error (σημαντικά και τα 2):

 

>int main(void) {
       char* works1 = "foo";
       char works2[] = "foo";

       char* something;

       char* works3 = something;
       char oops[] = something;

       return 0;
}

Δημοσ.

 

Βασικά δε με ενδιαφέρει να μπω σε συζήτηση/διαφωνία γιατί α) ξέρω πως έχω δίκιο και β) παλιότερα είχα και γω την ίδια παρανόηση που έχεις και συ τώρα.

 

Αλλά έτσι για το χαβαλέ: αυτό που λες ότι "είναι το ίδιο", το λες απλά για να επιμείνεις στην προηγούμενη άποψή σου ή υπάρχει και κάποιο επιχείρημα;

>int main(int args, char* argv[])
int main(int args, char** argv)

 

Δημοσ.

Δεν έχω κάτι να προσφέρω στη συζήτηση, αλλά technically τα strings δεν είναι πίνακες. Μπορεί οι πίνακες να κάνουν decay σε char*, όμως όσον αφορά τον compiler άλλο type είναι το char[] και άλλο το char*.

 

Τα απλά strings πίνακες είναι, με ακριβώς τις ίδιες ιδιότητες των μη nul-terminated arrays of char, ομοίως και τα string literals. Όπως και οι πίνακες έτσι και τα strings και τα string-literals δεν μπορούν να χρησιμοποιηθούν απευθείας ως lvalues για assignments στον δείκτη εκκίνησής τους (τα string literals δεν μπορούν πουθενά).

 

Εκεί ακριβώς διαφέρουν από τα pure char * (που έτσι κι αλλιώς από μόνα τους δεν είναι πίνακες).

Δημοσ.

>int main(int args, char* argv[])
int main(int args, char** argv)

 

Σκέψου αυτό το αντιπαράδειγμα (δες το να τρέχει):

 

>void test(short blah) {
}

int main(void) {
       test(42);
       printf("%zu\n", sizeof(short));
       printf("%zu\n", sizeof(42));
       return 0;
}

 

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

Δημοσ.

Παίδες για να μην ανοίγω αλλο θεμα

 

 

θελω ας πουμε ο χρηστης να βάζει uniqueid δλδ να μην εισαγεται 2η ιδια τιμη

 

>do {
printf("enter unique id:");
scanf("%d",&i);
while ((fread((char *) &data, sizeof (data), 1, file)) == 1) {
if (i==data.uniqueid){ 
system("cls");
printf("the id already exists\n");
printf("enter unique id:");
scanf("%d",&i);
if(i!=data.uniqueid)break;
}
} 
} while (!mygeti(&data.uniqueid));

 

 

 

 

 

>
//to function mygeti
int mygeti(int *result) {
char buff [ 13 ]; /* signed 32-bit value, extra room for '\n' and '\0' */
return fgets(buff, sizeof buff, stdin) && sscanf(buff, "%d", result) == 1;
}

 

 

να τονισω πως το αρχειο το εχω ανοιξει

>FILE *file = fopen(filename, "a+");

Δημοσ.

Sorry για το off-topic, αλλά τι κακό είναι αυτό ρε παιδιά με τους κώδικες "ορνιθοσκαλίσματα"; Έχετε τσακωθεί με τα tabs και τα spaces; 8 στους 10 κώδικες που ποστάρονται στο φόρουμ από αρχάριους θέλουν... αποκρυπτογράφηση!

 

Προσωπικά έχω πάψει να ρίχνω καν 2η ματιά σε τέτοιου είδους κώδικες...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...