Dalam kursus pengantar C, saya telah belajar bahwa saat menyimpan string disimpan dengan karakter nol \0
di akhir. Tetapi bagaimana jika saya ingin mencetak string, katakan printf("hello")
meskipun saya telah menemukan bahwa itu tidak berakhir dengan \0
mengikuti pernyataan
printf("%d", printf("hello"));
Output: 5
tetapi ini tampaknya tidak konsisten, sejauh yang saya tahu bahwa variabel seperti string disimpan dalam memori utama dan saya kira saat mencetak sesuatu itu mungkin juga disimpan dalam memori utama, lalu mengapa bedanya?
);
, apa yang ingin Anda tunjukkan dengan kode itu? Bagaimana Anda membuktikan bahwa itu tidak berakhir dengan\0
?Jawaban:
Bita nol menandai akhir suatu string. Itu tidak dihitung dalam panjang string dan tidak dicetak ketika string dicetak dengan
printf
. Pada dasarnya, byte nol memberitahu fungsi yang melakukan manipulasi string kapan harus berhenti.Di mana Anda akan melihat perbedaannya adalah jika Anda membuat
char
array yang diinisialisasi dengan string. Menggunakansizeof
operator akan mencerminkan ukuran array termasuk byte nol. Sebagai contoh:sumber
printf()
. TBH Saya tidak tahu caraprintf()
kerjanya.printf
mengembalikan jumlah karakter yang dicetak.'\0'
tidak dicetak - itu hanya menandakan bahwa tidak ada lagi karakter dalam string ini. Itu tidak dihitung terhadap panjang string jugahttps://godbolt.org/z/wYn33e
sumber
Asumsi Anda salah. Tali Anda memang diakhiri dengan a
\0
.Ini berisi dari 5 karakter
h
,e
,l
,l
,o
dan 0 karakter.Apa yang dihasilkan oleh
print()
panggilan "dalam" adalah jumlah karakter yang dicetak, dan itu adalah 5.sumber
Dalam C semua string literal benar-benar array karakter, termasuk null-terminator.
Namun, terminator nol tidak dihitung dalam panjang string (literal atau tidak), dan itu tidak dicetak. Pencetakan berhenti ketika terminator nol ditemukan.
sumber
printf
akan keluar dari batas-batas string, dan mencetak karakter "acak" atau "sampah", dan mengembalikan sebuah nomor berbeda dari panjang tali. Jika Anda sudah tahu panjang string Anda juga bisa memeriksa apakah karakter pada indeks itu adalah'\0'
, yang akan berfungsi tetapi secara teknis tidak didefinisikan perilaku jika ukuran array tidak termasuk terminator (seperti padachar arr[5] = "hello";
, yang tidak akan menambahkan terminator ke array).char * p = "Hello"; int i = 0; while (p[i] != '\0') { printf("%d: %c", i, p[i]); i++; }
dan melihat cara kerjanya: ini menunjukkan garis dengan indeks dan konten di baris itu. Setelah indeks 4, ia menemukan karakter 0 dan memecah loop while. Di sana Anda melihat bahwa ada 0 karakter.Semua jawaban benar-benar baik tetapi saya ingin menambahkan contoh lain untuk melengkapi semua ini
Bagi mereka yang tidak ingin mencoba ini di gdb online, hasilnya adalah:
https://linux.die.net/man/3/printf
Apakah ini membantu untuk memahami apa yang dilakukan terminator melarikan diri? Ini bukan batas untuk array char atau string. Itu karakter yang akan mengatakan kepada pria yang mem-parsing-STOP, (cetak) parse sampai di sini.
PS: Dan jika Anda menguraikan dan mencetaknya sebagai array char
Anda mendapatkan:
di mana, spasi putih setelah l ganda, adalah terminator nol, namun, parsing array char, akan hanya nilai char dari setiap byte. Jika Anda melakukan parse lain dan mencetak nilai int setiap byte ("% d%, char_array [i]), Anda akan melihat bahwa (Anda mendapatkan representasi kode-ASCII) spasi putih memiliki nilai 0.
sumber
Dalam
C
fungsiprintf()
mengembalikan jumlah karakter yang dicetak,\0
adalahnull
terminator yang digunakan untuk menunjukkan akhir string dalam bahasa c dan tidak adastring
tipec++
bawaan pada , namun ukuran array Anda harus setidaknya lebih besar dari jumlah yangchar
Anda inginkan menyimpan.Inilah refnya: cpp ref printf ()
sumber
Anda salah. Pernyataan ini tidak mengkonfirmasi bahwa string literal
"hello"
tidak berakhir dengan karakter nol penghentian'\0'
. Pernyataan ini mengonfirmasi bahwa fungsiprintf
menampilkan elemen string hingga karakter nol terminasi ditemukan.Ketika Anda menggunakan string literal seperti dalam pernyataan di atas maka kompiler membuat array karakter dengan durasi penyimpanan statis yang berisi elemen string string.
Jadi sebenarnya ungkapan ini
diproses oleh kompiler sesuatu seperti yang berikut ini
Tindakan fungsi printf dalam hal ini dapat Anda bayangkan dengan cara berikut
Untuk mendapatkan jumlah karakter yang tersimpan dalam string literal "halo" Anda dapat menjalankan program berikut
Output program adalah
sumber
Anda harus menghapus konsep Anda terlebih dahulu .. Karena akan dihapus ketika Anda berurusan dengan array, Perintah cetak yang Anda gunakan hanya menghitung karakter yang ditempatkan dalam paranthesis. Diperlukan dalam string array yang akan diakhiri dengan \ 0
sumber
String adalah vektor karakter. Berisi urutan karakter yang membentuk string, diikuti oleh string karakter akhir khusus: '\ 0'
Contoh: char str [10] = {'H', 'e', 'l', 'l', 'o', '\ 0'};
Contoh: vektor karakter berikut bukan satu string karena tidak diakhiri dengan '\ 0'
char str [2] = {'h', 'e'};
sumber