Membandingkan String di C
Membandingkan string sangat umum dilakukan, tapi ada yang perlu diperhatikan ketika membandingkan string di C, bisa saja konten yang dibandingkan sama tapi menghasilkan false.
Symptom
Kita lihat contoh kode dibawah ini
#include <stdio.h>
int main(void){
char s1[] = "Hi!";
char s2[] = "Hi!";
if(s1 == s2){
printf("same!");
} else {
printf("different!");
}
return 0;
}
Hasil dari kode diatas adalah different! padahal value dari kedua variabel tersebut sama.
Pada dasarnya, string di C adalah pointer ke karakter pertama. Jika saya coba gambarkan didalam memori akan terlihat seperti ini

Kita bisa melihat kedua variabel tersebut menyimpan alamat memori yang berbeda, dan perbandingan yang dilakukan adalah perbandingan alamat memori itu, bukan value dari alamat memori.
Sekarang, kita coba keluarkan alamat memori kedua variabel tersebut
#include <stdio.h>
int main(void){
char s1[] = "Hi!";
char s2[] = "Hi!";
printf("%p\n", s1); // output: 0x7fffb638c420
printf("%p\n", s2); // output: 0x7fffb638c424
return 0;
}
Kedua variabel tersebut memiliki alamat yang berbeda, karena hal itulah ketika kita coba membandingkan dengan equality operator (==) hasilnya different! meskipun memiliki value yang sama karena yang dibandingkan adalah alamat memorinya bukan value yang disimpan.
Next, karena string bisa dibuat dengan dua cara, pertama menggunakan array, kedua menggunakan pointer, dan apa yang terjadi jika kita membandingkan string yang dibuat dengan pointer?
#include <stdio.h>
int main(void){
char *s1 = "Hi!";
char *s2 = "Hi!";
if(s1 == s2){
printf("same!");
} else {
printf("different!");
}
return 0;
}
Ternyata, jika kita membuat string dengan pointer, hasilnya same!, kenapa beda dengan string yang dibuat dengan array?
Pertama perlu kita ingat bahwa string yang dibuat dengan pointer bersifat read-only, jadi kita tidak dapat merubah apapun dari string tersebut, jika kita coba untuk merubahnya, maka akan menghasilkan error.
#include <stdio.h>
int main(void){
char *s1 = "Hi!";
char *s2 = "Hi!";
s1[0] = 'h'; // [1] 23918 segmentation fault (core dumped) ./output
if(s1 == s2){
printf("same!");
} else {
printf("different!");
}
return 0;
}
Sebenarnya, hasil same ini karena compiler melakukan String Literal Pooling, singkatnya karena string tersebut read-only, dan tidak dapat berubah, maka kenapa harus menggunakan alamat yang berbeda sedangkan value yang disimpan sama? Jika kita lihat di memori akan tampak hanya ada satu string literal seperti ini

Kedua variabel tersebut menunjuk ke alamat memori yang sama, tapi sebaiknya kita menghindari penggunaan equality operator untuk membandingka dua string, karena tidak ada jaminan bahwa compiler akan menyimpan string literal yang sama di alamat memori yang sama.
Solution
Bahasa C menyediakan function strcmp untuk membandingkan dua string melalui library string.h
#include <stdio.h>
#include <string.h>
int main(void){
char s1[] = "Hi!";
char s2[] = "Hi!";
if(strcmp(s1, s2) == 0){
printf("same!");
} else {
printf("different!");
}
return 0;
}
Sekarang hasilnya same!, meskipun kita membuat variabel string menggunakan array, karena function tersebut membandingkan value dari string, bukan alamat memori string.
Cara lain, kita bisa membuat function sendiri untuk membandingkan value dari kedua string tersebut.
- C Programming Language