Saya seharusnya menjawab pertanyaan pekerjaan rumah untuk salah satu kelas saya. Secara khusus, saya seharusnya mengatakan apakah array dalam C dianggap string atau tidak. Berdasarkan artikel ini ( https://www.geeksforgeeks.org/strings-in-c-2/ ) Saya tahu bahwa string adalah array karakter dengan terminator nol di akhir.
Hangup utama saya adalah bagian dari pertanyaan yang menanyakan tentang array yang terlihat seperti ini:
char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
Ini jelas merupakan array karakter dengan karakter terminasi nol di akhir. Namun, apakah masih dianggap sebagai string karena ia juga memiliki karakter terminasi nol di tengah? Bagaimana itu akan mempengaruhi string?
EDIT: Berdasarkan komentar, saya telah memberikan kata-kata aktual dari pertanyaan:
"Manakah dari array berikut ini yang dapat dianggap sebagai" string "untuk keperluan menggunakannya sebagai argumen untuk strcpy (), strncpy (), strcmp (), strncmp (), dan fungsi string serupa (menunjukkan semua yang berlaku)?"
EDIT: Saya diemail profesor saya tentang hal itu karena pertanyaan itu tampaknya kata-kata yang ambigu (seperti beberapa orang tunjukkan). Jika ada orang yang penasaran, dia berkata kepada saya, "Ya itu adalah string. Kuncinya adalah bahwa ada karakter nol. Tapi tentu saja itu akan mempengaruhi operasi string apa pun; string berakhir pada karakter nol."
sumber
"CS"
dengan beberapa byte sampah yang ditambahkan (dalam hal ini karakter NUL akhir tidak relevan). Tetapi ini bukan string "secara keseluruhan". - Namun demikian, memberi makan ini kestrcpy
dll tidak akan membuat pc Anda meledak karena fungsi-fungsi ini akan "melihat" hanya"CS"
bagian itu.strcmp()
. Apakah itu dapat digunakan sebagai argumen untuk mematikan fungsi string tergantung pada faktor-faktor tambahan yang tidak disediakan.c1
bisa berubah, jadi saya tidak melihat mengapa itu akan gagal menjadi argumen tujuan yang valid untukstrcpy
atau serupa, kecuali karena itu tidak cukup besar untuk mengakomodasi string sumber. Itu tidak akan membuatnya menjadi string, hanya saja tidak cocok untuk tujuan tertentu.c1
akan memenuhi persyaratan dasar untuk argumen string untuk semua fungsi string (sempit) perpustakaan standar, termasuk semua yang secara spesifik dinamai, tetapi perilaku mungkin bukan apa yang diharapkan atau diinginkan penelepon (bahkan mengabaikan perilaku tidak terdefinisi yang dapat ditimbulkan).char
. Semua tipe karakter akan dilakukan.Jawaban:
c1
sebagian besar [1] setara dengan&c1[0]
, yang memegang satu string"CS"
,.Ada string kedua bersembunyi di sana,
"324"
, mulai dari&c1[3]
- tetapi selama Anda mengaksesc1
sebagaic1
, string"CS"
adalah semua fungsistrcpy()
et al. akan melihat.[1]:
c1
adalah sebuah array,&c1[0]
adalah sebuah pointer.sumber
c1
sebagai string target dalam suatustrcpy()
perintah? Pertanyaannya ambigu - paling banter.c1
sebagai argumen untukstrcpy()
. Ini adalah string yang sangat biasa dalam segala hal. String biasa sering mengandung sampah sisa setelah terminator mereka. Fakta bahwa sampah ini dikodekan ke dalam program memberikan kesan bahwa penulis bermaksud untuk menggunakanc1
cara-cara non-string, tetapi itu bukan bagian dari pertanyaan.c1
setara dengan&c1[0]
" menyesatkan.c1
adalah sebuah array.&c1[0]
adalah sebuah pointer.Jika Anda ingin mengetahui secara spesifik definisi string dalam C, buka sumbernya.
Dari standar C90 :
(Tidak ada perubahan yang relevan dalam standar nanti.)
Dengan demikian,
c1
berisi dua string berturut-turut, "CS" dan "324", tetapi bukan merupakan string.Jika kita melewatkan array ke suatu fungsi, ia meluruh ke sebuah pointer ke elemen pertamanya, dengan demikian
+c1
menunjuk ke sebuah string (yang pertama), yang cukup bagus untuk fungsi apa pun yang mengharapkan pointer ke string. Itu tidak menunjuk ke string "CS \ 0324", tapi itu mungkin cukup baik untuk pertanyaan instruktur Anda, yang ambigu.sumber
+c1
menunjuk ke sebuah string, karenac1
dimulai dengan sebuah string. Itu tidak dengan cara apa pun, bentuk, atau bentuk membuatc1
string sekalipun.Menambahkan ke jawaban @ DevSolar, sesuatu yang saya temukan setelah bermain-main dengan string yang diberikan, jika itu adalah:
Jika Anda menampilkan string ini, Anda akan mendapatkan
CS03240
dan ukuran string ini adalah 7. Sejauh pemahaman saya,\\0
digunakan untuk menunjukkan karakter nol ( yaitu\0
). Jika kamu melakukan:Anda tidak melihat apa pun di log keluaran, tetapi jika Anda melakukannya:
Anda melihat
\0
, sesuatu yang diharapkan karena untuk menghasilkan karakter khusus seperti garis miring terbalik atau tanda kutip, Anda harus menggunakan\
bersama dengan mereka.Sesuatu yang membingungkan saya adalah output
CS03240
dan ukurannya 7. Ini adalah pemahaman umum bahwa ukuran string adalah jumlah karakter di dalamnya ditambah satu (untuk karakter nol). Juga, ukurannya adalah 7 bahkan untuk stringchar c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
,.Jadi mungkin tindak lanjut dari pertanyaan ini, apa yang terjadi di sini?
sumber
'\\0'
bukan karakter nol . Ini adalah konstanta multi-karakter. Ini memiliki nilai yang ditentukan implementasi tentu di luar kisaranchar
.c1[]
bukan string karena tidak memiliki karakter nol . "Anda menghasilkan string ini" kemungkinan menghasilkan perilaku yang tidak terdefinisi .char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };
adalah ukuran 7 karena diinisialisasi dengan 7 nilai. Ini ukuran tidak ada hubungannya dengan string .char c1[] = { 1, 2, 3, 4, 5, 6, 7 };
akan tetap membuatnya ukuran 7.c1
mengandung sengatan? Itu masalah terpisah. Lihat juga