Σύγκριση συμβολοσειρών: Προγραμματισμός Γ

String Comparison C Programming



Μια συμβολοσειρά στη γλώσσα C είναι ένας πίνακας χαρακτήρων, ο οποίος τερματίζεται με μηδενικό χαρακτήρα ( 0). Η χρήση αυτής της ιδιότητας συγκρίνονται με συμβολοσειρές.







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



Σύγκριση συμβολοσειρών χρησιμοποιώντας μια συνάρτηση που ορίζεται από το χρήστη:

Θα γράψουμε μια συνάρτηση stringCompare () να συγκρίνει συμβολοσειρές. Διασχίζουμε τις συμβολοσειρές και συγκρίνουμε κάθε χαρακτήρα της συμβολοσειράς έως ότου φτάσουμε στο τέλος μιας ή και των δύο ή μία αναντιστοιχία. Εάν η παράκαμψη φτάσει στο τέλος και των δύο συμβολοσειρών, τότε οι συμβολοσειρές ταιριάζουν. Διαφορετικά, οι χορδές δεν ταιριάζουν.



01Το/*userDefinedFunction.c*/
02Το
03Το#περιλαμβάνω
04Το
05ΤοintstringCompare( απανθρακώνωstr1[ ], απανθρακώνωstr2[ ] )
06Το{
07ΤοintΕγώ=0?
08
09 ενώ(str1[Εγώ] ==str2[Εγώ] )
10Το
δεκαπέντεΤο
16Τοαν(str1[Εγώ] == ' 0' &&str2[Εγώ] == ' 0' )
17ΤοΕΠΙΣΤΡΟΦΗ 0?
18Τοαλλού
19ΤοΕΠΙΣΤΡΟΦΗ -1?
είκοσιΤο
είκοσι έναΤο}
22Το
2. 3Το
24Τοintκύριος()
25Το{
26Τοαπανθρακώνωstr1[30],str2[30]?
27Το
28Το printf ('Εισαγάγετε την πρώτη συμβολοσειρά:')?
29Το scanf ('% [^ n]% * c ',str1)?
30Το printf ('Εισαγάγετε τη δεύτερη συμβολοσειρά:')?
31Το scanf ('% [^ n]% * c ',str2)?
32Το
33Τοαν(stringCompare(str1,str2) == 0)
3. 4Το printf («Οι χορδές είναι ίσες n')?
35Τοαλλού
36Το printf («Οι χορδές δεν είναι ίσες n')?
37Το
38ΤοΕΠΙΣΤΡΟΦΗ 0? 39Το}





Εδώ διασχίζουμε τις συμβολοσειρές χρησιμοποιώντας το βρόχο while και μια μεταβλητή Εγώ Το Όταν οι χαρακτήρες είναι ίσοι στην ίδια θέση και των δύο συμβολοσειρών, η τιμή του Εγώ αυξάνεται κατά 1 (γραμμή 13). Εάν οι χαρακτήρες δεν είναι ίσοι (γραμμή 09) ή φτάσουμε στο τέλος της συμβολοσειράς (γραμμή 11), τότε ο βρόχος while είναι ένα διάλειμμα. Μετά τον βρόχο while, ελέγχουμε ότι και οι δύο διασχίσεις έχουν φτάσει στο τέλος ή όχι (γραμμή 16). Εάν η παράκαμψη φτάσει στο τέλος και των δύο συμβολοσειρών, τότε οι συμβολοσειρές είναι ίσες κατά τα άλλα όχι.

Σύγκριση συμβολοσειρών χρησιμοποιώντας ενσωματωμένες λειτουργίες βιβλιοθήκης:

Οι ακόλουθες συναρτήσεις βιβλιοθήκης μπορούν να χρησιμοποιηθούν για σύγκριση συμβολοσειρών. Όλες οι συναρτήσεις δηλώνονται στο συμβολοσειρά.η αρχείο κεφαλίδας.



συνάρτηση strcmp ():

Αυτή η συνάρτηση συγκρίνει δύο συμβολοσειρές που έχουν περάσει στη συνάρτηση.

Σύνταξη :

int strcmp (const απανθρακώνω *str1, const απανθρακώνω *str2)

Επιστροφή τιμής: Επιστρέψτε 0 αν οι συμβολοσειρές είναι ίσες. Επιστρέψτε έναν αρνητικό ακέραιο εάν η τιμή ASCII του πρώτου ασύγκριτου χαρακτήρα της πρώτης συμβολοσειράς είναι μικρότερη από τη δεύτερη συμβολοσειρά. Επιστρέψτε έναν θετικό ακέραιο εάν η τιμή ASCII του πρώτου ασύγκριτου χαρακτήρα της πρώτης συμβολοσειράς είναι μεγαλύτερη από τη δεύτερη συμβολοσειρά. Ορισμένα συστήματα επιστρέφουν τη διαφορά της τιμής ASCII του πρώτου αταίριαστου χαρακτήρα και ορισμένα συστήματα επιστρέφουν -1 εάν η τιμή ASCII του πρώτου ασύμβατου χαρακτήρα της πρώτης συμβολοσειράς είναι μικρότερη από τη δεύτερη συμβολοσειρά και επιστρέφει 1 εάν η τιμή ASCII του πρώτου ασύμβατου χαρακτήρα του η πρώτη συμβολοσειρά είναι μεγαλύτερη από τη δεύτερη συμβολοσειρά.

Παράδειγμα Επιστροφή τιμής Εξήγηση
strcmp ( Hello World, Hello World ) 0 Δύο χορδές είναι ίδιες.
strcmp ( Γεια σας, Γεια σας 0 Κόσμος ) 0 Οι συμβολοσειρές συγκρίνονται μέχρι τον χαρακτήρα ' 0'. Η πρώτη συμβολοσειρά από προεπιλογή τελειώνει με ' 0' και η δεύτερη συμβολοσειρά περιέχει τον χαρακτήρα ' 0' μετά το 'Γεια'.
strcmp ( Γεια σας 0 0 0 Hello, Γεια σας 0 Κόσμος ) 0 Οι συμβολοσειρές συγκρίνονται μέχρι τον χαρακτήρα ' 0'.
strcmp ( Γεια σου Κόσμο, Γεια σου Κόσμο ) Αρνητικός ακέραιος Η τιμή ASCII του πρώτου ασύγκριτου χαρακτήρα της πρώτης συμβολοσειράς («H») είναι μικρότερη από τη δεύτερη συμβολοσειρά («h»)
strcmp ( γεια σου κόσμο, γεια σου κόσμο ) Θετικός ακέραιος Η τιμή ASCII του πρώτου ασύγκριτου χαρακτήρα της πρώτης συμβολοσειράς («h») είναι μεγαλύτερη από τη δεύτερη συμβολοσειρά («H»)

συνάρτηση strncmp ():

Αυτή η λειτουργία είναι παρόμοια με τη συνάρτηση strcmp () , αλλά εδώ πρέπει να καθορίσουμε πόσα byte συγκρίνονται περνώντας ένα επιπλέον όρισμα στη συνάρτηση.

Σύνταξη:

int strncmp (const απανθρακώνω *str1, const απανθρακώνω *str2, μέγεθος_τν)

Επιστροφή τιμής: Η συνάρτηση επιστρέφει 0 αν το πρώτο ν Οι χαρακτήρες των δύο χορδών είναι ίσοι. Διαφορετικά, επιστρέφει αρνητικό ή θετικό ακέραιο ανάλογα με το πρόσημο των διαφορών μεταξύ της τιμής ASCII του πρώτου αταίριαστου χαρακτήρα.

Παράδειγμα Επιστροφή τιμής Εξήγηση
strncmp ( Hello World, Hello World, 5 ) 0 Οι 5 πρώτοι χαρακτήρες είναι ίδιοι.
strncmp ( Γεια σας, Γεια σας 0 Κόσμος, 5 ) 0 Οι 5 πρώτοι χαρακτήρες είναι ίδιοι.
strncmp ( Γεια σας 0 0 0 Hello, Γεια σας 0 Κόσμος, 8 ) 0 Το ‘ 0’ είναι μετά τους 5 πρώτους χαρακτήρες και στις δύο συμβολοσειρές. Έτσι, η σύγκριση σταματά μετά το 5 και όχι το 8.
strncmp ( Γεια σου Κόσμος, γεια σου Κόσμος, 5 ) Αρνητικός ακέραιος Η τιμή ASCII του πρώτου ασύγκριτου χαρακτήρα της πρώτης συμβολοσειράς («H») είναι μικρότερη από τη δεύτερη συμβολοσειρά («h»)

συνάρτηση strcasecmp ():

Αυτή η λειτουργία είναι παρόμοια με τη συνάρτηση strcmp () , αλλά εδώ οι συμβολοσειρές δεν έχουν διάκριση πεζών -κεφαλαίων.

Σύνταξη:

intstrcasecmp(const απανθρακώνω *str1, const απανθρακώνω *str2)

Επιστροφή τιμής: Το ίδιο με strcmp () , αλλά οι χορδές αντιμετωπίζονται ως με διάκριση πεζών-κεφαλαίων Το

Παράδειγμα Επιστροφή τιμής Εξήγηση
strcasecmp ( Hello World, Hello World ) 0 Δύο χορδές είναι ίδιες.
strcasecmp ( Γεια σας, Γεια σας 0 Κόσμος ) 0 Οι συμβολοσειρές συγκρίνονται μέχρι τον χαρακτήρα ' 0'. Η πρώτη συμβολοσειρά από προεπιλογή τελειώνει με ' 0' και η δεύτερη συμβολοσειρά περιέχει τον χαρακτήρα ' 0' μετά το 'Γεια'.
strcasecmp ( Γεια σου Κόσμο, Γεια σου Κόσμο ) 0 Οι χορδές είναι με διάκριση πεζών-κεφαλαίων. Έτσι, το Hello World και το hello World είναι το ίδιο.

συνάρτηση strncasecmp ():

Αυτή η λειτουργία είναι παρόμοια με τη συνάρτηση strncmp () , αλλά εδώ οι συμβολοσειρές δεν έχουν διάκριση πεζών -κεφαλαίων.

Σύνταξη:

intstrncasecmp(const απανθρακώνω *str1, const απανθρακώνω *str2)

Επιστροφή τιμής: Το ίδιο με strncmp () , όταν οι συμβολοσειρές αντιμετωπίζονται ως διάκριση πεζών-κεφαλαίων.

Παράδειγμα Επιστροφή τιμής Εξήγηση
strncasecmp ( Hello World, Hello World, 5 ) 0 Οι 5 πρώτοι χαρακτήρες είναι ίδιοι.
strncasecmp ( Γεια σας, Γεια σας 0 Κόσμος, 5 ) 0 Οι 5 πρώτοι χαρακτήρες είναι ίδιοι.
strncasecmp ( Γεια σας 0 0 0 Hello, Γεια σας 0 Κόσμος, 8 ) 0 Το ‘ 0’ είναι μετά τους 5 πρώτους χαρακτήρες και στις δύο συμβολοσειρές. Έτσι, η σύγκριση σταματά μετά το 5 και όχι το 8.
strncasecmp ( Γεια σου Κόσμος, γεια σου Κόσμος, 5 ) 0 Οι χορδές είναι με διάκριση πεζών-κεφαλαίων. Λοιπόν, γεια και γεια είναι το ίδιο.

συνάρτηση memcmp ():

Αυτή η συνάρτηση συγκρίνει δύο μπλοκ μνήμης byte by byte. Πρέπει να περάσουμε δύο δείκτες των μπλοκ μνήμης και τον αριθμό των byte για σύγκριση.

Σύνταξη:

int memcmp (const κενός *str1, const κενός *str2, μέγεθος_τν)

Επιστροφή τιμής: Η συνάρτηση επιστρέφει 0 αν τα δύο μπλοκ μνήμης ( ν bytes) είναι ίσα. Διαφορετικά, επιστρέφει τις διαφορές μεταξύ του πρώτου αταίριαστου ζεύγους byte (τα bytes ερμηνεύονται ως ανυπόγραφα αντικείμενα char, στη συνέχεια προωθούνται στο int).

Παράδειγμα Επιστροφή τιμής Εξήγηση
memcmp ( Hello World, Hello World, 5 ) 0 Οι 5 πρώτοι χαρακτήρες είναι ίδιοι.
memcmp ( Γεια σας 0 0 0 Hello, Γεια σας 0 Κόσμος, 8 ) Αρνητικός ακέραιος Οι πρώτοι 6 χαρακτήρες είναι ίδιοι, αλλά ο 7ος χαρακτήρας είναι διαφορετικός. Εδώ η σύγκριση δεν σταμάτησε όπως strncmp () όταν παίρνετε χαρακτήρα ‘ 0’.
memcmp ( Hello World, γεια World, 11 ) Αρνητικός ακέραιος Η τιμή ASCII του πρώτου ασύγκριτου χαρακτήρα της πρώτης συμβολοσειράς («H») είναι μικρότερη από τη δεύτερη συμβολοσειρά («h»)

Παράδειγμα:

Ακολουθεί το παράδειγμα κώδικα C όλων των λειτουργιών που συζητήθηκαν.

01Το/*stringCompare.c*/
02Το
03Το#περιλαμβάνω
04Το#περιλαμβάνω
05Το
06Τοintκύριος()
07Το{
08 printf ('strcmp ('Γειά σου Κόσμε','Γειά σου Κόσμε') => %d n', strcmp ( 'Γειά σου Κόσμε','Γειά σου Κόσμε' ))?
09 printf ('strcmp ('γεια σας','Γεια σας\0Κόσμος') => %d n', strcmp ( 'Γεια σας','Γεια σας 0Κόσμος' ))?
10Το printf ('strcmp ('Γειά σου Κόσμε','Γειά σου Κόσμε') => %d n', strcmp ( 'Γειά σου Κόσμε','Γειά σου Κόσμε' ) )?
έντεκαΤο printf ('strcmp ('Γεια σας\0\0\0','Γεια σας\0Κόσμος') => %d n', strcmp ( 'Γεια σας 0 0 0','Γεια σας 0Κόσμος' ))?
12Το
13Το printf (' n--------------- n')?
14Το
δεκαπέντεΤο printf ('strncmp ('Γειά σου Κόσμε','Γειά σου Κόσμε', 5) => %d n', strncmp ( 'Γειά σου Κόσμε','Γειά σου Κόσμε',5 ))?
16Το printf ('strncmp ('γεια σας','Γεια σας\0Κόσμος', 5) => %d n', strncmp ( 'Γεια σας','Γεια σας 0Κόσμος',5 ))?
17Το printf ('strncmp ('Γεια σας\0\0\0','Γεια σας\0Κόσμος', 8) => %d n', strncmp ( 'Γεια σας 0 0 0','Γεια σας 0Κόσμος',8 ))?
18Το printf ('strncmp ('Γειά σου Κόσμε','Γειά σου Κόσμε', 5) => %d n', strncmp ( 'Γειά σου Κόσμε','Γειά σου Κόσμε',5 ))?
19Το
είκοσιΤο printf (' n--------------- n')?
είκοσι έναΤο
22Το printf ('strcasecmp ('Γειά σου Κόσμε','Γειά σου Κόσμε') => %d n',strcasecmp( 'Γειά σου Κόσμε','Γειά σου Κόσμε' ))?
2. 3Το printf ('strcasecmp ('γεια σας','Γεια σας\0Κόσμος') => %d n',strcasecmp( 'Γεια σας','Γεια σας 0Κόσμος' ))?
24Το printf ('strcasecmp ('Γειά σου Κόσμε','Γειά σου Κόσμε') => %d n',strcasecmp( 'Γειά σου Κόσμε','Γειά σου Κόσμε' ))?
25Το
26Το printf (' n--------------- n')?
27Το
28Το printf ('strncasecmp ('Γειά σου Κόσμε','Γειά σου Κόσμε', 5) => %d n',strncasecmp( 'Γειά σου Κόσμε','Γειά σου Κόσμε',5 ) )?
29Το printf ('strncasecmp ('γεια σας','Γεια σας\0Κόσμος', 5) => %d n',strncasecmp( 'Γεια σας','Γεια σας 0Κόσμος',5 ))?
30Το printf ('strncasecmp ('Γεια σας\0\0\0','Γεια σας\0Κόσμος', 8) => %d n',strncasecmp( 'Γεια σας 0 0 0','Γεια σας 0Κόσμος',8 ))?
31Το printf ('strncasecmp ('Γειά σου Κόσμε','Γειά σου Κόσμε', 5) => %d n',strncasecmp( 'Γειά σου Κόσμε','Γειά σου Κόσμε',5 ))?
32Το
33Το printf (' n--------------- n')?
3. 4Το
35Το printf ('memcmp ('Γειά σου Κόσμε','Γειά σου Κόσμε', 5) => %d n', memcmp ( 'Γειά σου Κόσμε','Γειά σου Κόσμε',5 ) )?
36Το printf ('memcmp ('Γεια σας\0\0\0','Γεια σας\0Κόσμος', 8) => %d n', memcmp ( 'Γεια σας 0 0 0','Γεια σας 0Κόσμος',8 ))?
37Το printf ('memcmp ('Γειά σου Κόσμε','Γειά σου Κόσμε', 11) => %d n', memcmp ( 'Γειά σου Κόσμε','Γειά σου Κόσμε',έντεκα ))?
38Το
39ΤοΕΠΙΣΤΡΟΦΗ 0? 40Το}

Συμπέρασμα:

Έτσι, σε αυτό το σεμινάριο, είδαμε πώς μπορούν να συγκριθούν οι συμβολοσειρές με διάφορους τρόπους. Όπως είδαμε, η συνάρτηση stringCompare () επιστρέφει -1 για άνισες συμβολοσειρές, αλλά αυτή μπορεί να τροποποιηθεί έτσι ώστε να επιστρέψει την τιμή ασυμφωνίας ASCII. Μπορείτε να το χρησιμοποιήσετε στον κωδικό σας, ο οποίος ταιριάζει καλύτερα σε εσάς.