Apa spesifikasi dari string dalam C?

10

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."

quango
sumber
4
Anda mungkin mengatakan bahwa itu adalah string "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 ke strcpydll tidak akan membuat pc Anda meledak karena fungsi-fungsi ini akan "melihat" hanya "CS"bagian itu.
Hagen von Eitzen
2
c1 benar - benar dapat digunakan sebagai argumen strcmp(). Apakah itu dapat digunakan sebagai argumen untuk mematikan fungsi string tergantung pada faktor-faktor tambahan yang tidak disediakan.
EOF
2
Isi dari c1bisa berubah, jadi saya tidak melihat mengapa itu akan gagal menjadi argumen tujuan yang valid untuk strcpyatau serupa, kecuali karena itu tidak cukup besar untuk mengakomodasi string sumber. Itu tidak akan membuatnya menjadi string, hanya saja tidak cocok untuk tujuan tertentu.
John Bollinger
1
Secara keseluruhan, saya setuju bahwa pertanyaannya adalah kata-kata yang ambigu. Ekspresi c1akan 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).
John Bollinger
1
Perhatikan bahwa jenisnya tidak perlu char. Semua tipe karakter akan dilakukan.
chux

Jawaban:

8

c1sebagian 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 mengakses c1sebagai c1, string "CS"adalah semua fungsi strcpy()et al. akan melihat.


[1]: c1adalah sebuah array, &c1[0]adalah sebuah pointer.

DevSolar
sumber
Jadi, apakah pantas untuk digunakan c1sebagai string target dalam suatu strcpy()perintah? Pertanyaannya ambigu - paling banter.
Andrew Henle
1
Tentu saja Anda dapat menggunakan c1sebagai argumen untuk strcpy(). 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 menggunakan c1cara-cara non-string, tetapi itu bukan bagian dari pertanyaan.
Lee Daniel Crocker
" c1setara dengan &c1[0]" menyesatkan. c1adalah sebuah array. &c1[0]adalah sebuah pointer.
chux - Reinstate Monica
2

Jika Anda ingin mengetahui secara spesifik definisi string dalam C, buka sumbernya.

Dari standar C90 :

7 Perpustakaan

7.1 Pendahuluan

7.1.1 Definisi istilah
A String adalah urutan bersebelahan karakter diakhiri oleh dan termasuk karakter null pertama. "Penunjuk ke" string adalah penunjuk ke karakter awal (terendah yang dialamatkan). "Panjang" string adalah jumlah karakter sebelum karakter nol dan "nilainya" adalah urutan nilai dari karakter yang terkandung, secara berurutan.

(Tidak ada perubahan yang relevan dalam standar nanti.)

Dengan demikian, c1berisi 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 +c1menunjuk 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.

Deduplicator
sumber
4
Saya berpendapat bahwa bahkan dengan definisi ini, c1 jelas adalah string "CS". Titik. Fakta bahwa itu mungkin mengandung byte yang tidak nol setelah terminator tidak relevan - banyak string akan seperti itu di masa hidup mereka.
Lee Daniel Crocker
+c1menunjuk ke sebuah string, karena c1dimulai dengan sebuah string. Itu tidak dengan cara apa pun, bentuk, atau bentuk membuat c1string sekalipun.
Deduplicator
2
Ini adalah alamat bagian memori yang berisi beberapa karakter yang diakhiri dengan nol byte. Jika printf () baik-baik saja dengan% s, itu akan memberikan angka yang sangat baik diteruskan ke strlen (), akan berfungsi jika diteruskan ke strcpy (), dll. Kedengarannya seperti string bagi saya.
Lee Daniel Crocker
Tentu saja. Tetapi array tentu bisa menjadi string.
Lee Daniel Crocker
0

Menambahkan ke jawaban @ DevSolar, sesuatu yang saya temukan setelah bermain-main dengan string yang diberikan, jika itu adalah:

char c1[] = { 'C', 'S', '\\0', '3', '2', '4', '\\0' };

Jika Anda menampilkan string ini, Anda akan mendapatkan CS03240dan ukuran string ini adalah 7. Sejauh pemahaman saya, \\0digunakan untuk menunjukkan karakter nol ( yaitu \0 ). Jika kamu melakukan:

printf("\0");

Anda tidak melihat apa pun di log keluaran, tetapi jika Anda melakukannya:

printf("\\0");

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 CS03240dan 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 string char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };,.

Jadi mungkin tindak lanjut dari pertanyaan ini, apa yang terjadi di sini?

rasengan__
sumber
1
'\\0'bukan karakter nol . Ini adalah konstanta multi-karakter. Ini memiliki nilai yang ditentukan implementasi tentu di luar kisaran char. c1[]bukan string karena tidak memiliki karakter nol . "Anda menghasilkan string ini" kemungkinan menghasilkan perilaku yang tidak terdefinisi .
chux
Saya tidak benar-benar membuat Anda berpikir meskipun saya mencari konstanta multi karakter. Jika c1 [] bukan string karena tidak memiliki karakter nol pada akhirnya, lalu mengapa ukurannya keluar sebagai 7 dalam kasus awal seperti yang diposting oleh OP?
rasengan__
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.
chux - Reinstate Monica
Seperti apakah array c1mengandung sengatan? Itu masalah terpisah. Lihat juga
chux