Saya mencoba untuk mendapatkan sebuah program yang memungkinkan pengguna memasukkan sebuah kata atau karakter, toko, dan kemudian mencetaknya sampai pengguna jenis ini lagi, keluar dari program. Kode saya terlihat seperti ini:
#include <stdio.h>
int main()
{
char input[40];
char check[40];
int i=0;
printf("Hello!\nPlease enter a word or character:\n");
gets(input);
printf("I will now repeat this until you type it back to me.\n");
while (check != input)
{
printf("%s\n", input);
gets(check);
}
printf("Good bye!");
return 0;
}
Masalahnya adalah bahwa saya terus mendapatkan pencetakan string masukan, bahkan ketika input oleh pengguna (check) sesuai dengan aslinya (input). Saya membandingkan dua salah?
Anda dapat't (berguna) membandingkan string dengan menggunakan !=
atau ==
, anda perlu menggunakan strcmp
:
while (strcmp(check,input) != 0)
Alasan untuk ini adalah karena !=
dan ==
hanya akan membandingkan alamat dasar dari string tersebut. Bukan isi dari string diri mereka sendiri.
Ok beberapa hal: mendapat
tidak aman dan harus diganti dengan fgets(input, sizeof(input), stdin)
sehingga anda don't mendapatkan buffer overflow.
Selanjutnya, untuk membandingkan string, anda harus menggunakan strcmp
, di mana mengembalikan nilai 0 menunjukkan bahwa dua string pertandingan. Menggunakan kesetaraan operator (ie. !=
) membandingkan alamat dari dua string, sebagai lawan untuk individu `char di dalamnya.
Dan juga perhatikan bahwa, sementara dalam contoh ini tidak't menyebabkan masalah, fgets
toko karakter newline, '\n'
dalam buffer juga; gets()
tidak. Jika anda membandingkan input pengguna dari fgets()
untuk sebuah string literal seperti "abc"
itu tidak akan pernah setara (kecuali buffer terlalu kecil sehingga '\n'
tidak't muat di dalamnya).
EDIT: dan dipukuli oleh super cepat Mysticial sekali lagi.
Gunakan strcmp
.
Ini adalah di string.h
perpustakaan, dan sangat populer. strcmp
mengembalikan 0 jika string yang sama. Lihat this untuk penjelasan yang lebih baik dari apa yang strcmp
kembali.
Pada dasarnya, yang harus anda lakukan:
while (strcmp(check,input) != 0)
atau
while (!strcmp(check,input))
atau
while (strcmp(check,input))
Anda dapat memeriksa ini, tutorial tentang strcmp
.
Anda dapat't membandingkan array secara langsung seperti ini
array1==array2
Anda harus membandingkan mereka char-oleh-char; untuk ini anda dapat menggunakan fungsi dan return boolean (True:1, False:0) nilai. Kemudian anda dapat menggunakannya dalam tes kondisi dari while loop.
Coba ini:
#include <stdio.h>
int checker(char input[],char check[]);
int main()
{
char input[40];
char check[40];
int i=0;
printf("Hello!\nPlease enter a word or character:\n");
scanf("%s",input);
printf("I will now repeat this until you type it back to me.\n");
scanf("%s",check);
while (!checker(input,check))
{
printf("%s\n", input);
scanf("%s",check);
}
printf("Good bye!");
return 0;
}
int checker(char input[],char check[])
{
int i,result=1;
for(i=0; input[i]!='\0' || check[i]!='\0'; i++) {
if(input[i] != check[i]) {
result=0;
break;
}
}
return result;
}
Selamat datang konsep pointer. Generasi awal programmer telah menemukan konsep yang sulit dipahami, tapi jika anda berharap untuk tumbuh menjadi seorang programmer yang kompeten, anda akhirnya harus menguasai konsep — dan selain itu, anda juga sudah mengajukan pertanyaan yang tepat. Yang's baik.
Adalah jelas untuk anda apa alamatnya? Lihat diagram di bawah ini:
---------- ----------
| 0x4000 | | 0x4004 |
| 1 | | 7 |
---------- ----------
Dalam diagram, integer 1 disimpan di memori di alamat 0x4000. Mengapa di alamat? Karena memori yang lebih besar dan dapat menyimpan banyak bilangan bulat, hanya sebagai kota besar dan dapat menampung banyak keluarga. Setiap integer disimpan di lokasi memori, karena masing-masing keluarga berada di rumah. Masing-masing lokasi memori diidentifikasi oleh alamat, sebagai rumah masing-masing diidentifikasi oleh alamat.
Dua kotak dalam diagram mewakili dua lokasi memori yang berbeda. Anda dapat menganggap mereka seolah-olah mereka berada di rumah. Bilangan bulat 1 berada di lokasi memori pada alamat 0x4000 (berpikir, "4000 Elm St"). Integer 7 berada di lokasi memori pada alamat 0x4004 (berpikir, "4004 Elm St").
Anda berpikir bahwa anda program ini adalah membandingkan 1 ke 7, tapi itu bukan't. Itu membandingkan 0x4000 ke 0x4004. Jadi apa yang terjadi ketika anda memiliki situasi ini?
---------- ----------
| 0x4000 | | 0x4004 |
| 1 | | 1 |
---------- ----------
Dua bilangan bulat yang sama tetapi alamat berbeda. Program anda membandingkan alamat.
Setiap kali anda mencoba untuk membandingkan string, membandingkan mereka dengan hormat untuk masing-masing karakter. Untuk ini, anda dapat menggunakan built in string disebut fungsi strcmp(input1,input2); dan anda harus menggunakan header file yang bernama #include<string.h>
Coba kode ini:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char s[]="STACKOVERFLOW";
char s1[200];
printf("Enter the string to be checked\n");//enter the input string
scanf("%s",s1);
if(strcmp(s,s1)==0)//compare both the strings
{
printf("Both the Strings match\n");
}
else
{
printf("Entered String does not match\n");
}
system("pause");
}
Sayangnya anda dapat't menggunakan strcmp
dari <cstring>
karena itu adalah C++ header dan anda secara khusus mengatakan itu adalah sebuah aplikasi C. Aku punya masalah yang sama, jadi saya harus menulis saya sendiri fungsi yang menerapkan strcmp
:
int strcmp(char input[], char check[])
{
for (int i = 0;; i++)
{
if (input[i] == '\0' && check[i] == '\0')
{
break;
}
else if (input[i] == '\0' && check[i] != '\0')
{
return 1;
}
else if (input[i] != '\0' && check[i] == '\0')
{
return -1;
}
else if (input[i] > check[i])
{
return 1;
}
else if (input[i] < check[i])
{
return -1;
}
else
{
// characters are the same - continue and check next
}
}
return 0;
}
Saya berharap ini akan melayani anda dengan baik.
Bagaimana cara yang benar untuk membandingkan string?
char input[40];
char check[40];
strcpy(input, "Hello"); // input assigned somehow
strcpy(check, "Hello"); // check assigned somehow
// insufficient
while (check != input)
// good
while (strcmp(check, input) != 0)
// or
while (strcmp(check, input))
Mari kita menggali lebih dalam untuk melihat mengapa check != input
tidak cukup.
Dalam C, string adalah perpustakaan standar spesifikasi.
string adalah bersebelahan urutan dari karakter yang diakhiri dengan dan termasuk karakter null. C11 §7.1.1 1
input
di atas bukan string. input
adalah array 40 char.
Isi input
dapat menjadi string.
Dalam kebanyakan kasus, ketika sebuah array yang digunakan dalam suatu ekspresi, itu diubah menjadi alamat dari 1 unsur.
Di bawah ini mengkonversi check
dan input
untuk masing-masing alamat dari elemen pertama, kemudian alamat tersebut akan dibandingkan.
check != input // Compare addresses, not the contents of what addresses reference
Untuk membandingkan strings, kita perlu menggunakan alamat tersebut dan kemudian melihat data mereka.
strcmp()
melakukan pekerjaan. §7.23.4.2
int strcmp(const char *pendidikan s1, const char *s2);
strcmp
fungsi membandingkan string yang ditunjukkan olehs1
untuk string yang ditunjukkan olehs2
.
strcmp
fungsi mengembalikan sebuah integer yang lebih besar dari, sama dengan, atau kurang dari nol, dengan demikian sebagai string yang ditunjukkan olehs1
lebih besar dari, sama dengan, atau kurang dari string yang ditunjukkan olehs2
.
Tidak hanya dapat menemukan kode jika string dari data yang sama, tetapi yang satu lebih besar/kurang ketika mereka berbeda.
Di bawah ini adalah benar ketika string yang berbeda.
strcmp(check, input) != 0
Untuk wawasan, lihat Membuat saya sendiri strcmp()
fungsi
#include<stdio.h>
#include<string.h>
int main()
{
char s1[50],s2[50];
printf("Enter the character of strings: ");
gets(s1);
printf("\nEnter different character of string to repeat: \n");
while(strcmp(s1,s2))
{
printf("%s\n",s1);
gets(s2);
}
return 0;
}
Ini adalah solusi yang sangat sederhana di mana anda akan mendapatkan output seperti yang anda inginkan.