Saya mencoba membuat array string dalam C. Jika saya menggunakan kode ini:
char (*a[2])[14];
a[0]="blah";
a[1]="hmm";
gcc memberi saya "peringatan: tugas dari tipe pointer tidak kompatibel". Apa cara yang benar untuk melakukan ini?
sunting: Saya ingin tahu mengapa ini harus memberikan peringatan kompiler karena jika saya melakukannya printf(a[1]);
, ia akan mencetak "hmm" dengan benar.
char (*a[2])[14]
adalah array dari dua pointer ke array dari 14 karakter.char (*a[2])[14]
- mulai dia
, pindah ke kanan: "array dua", pindah ke kiri: "pointer ke", braket lengkap jadi baca kanan: "array of forteen", baca kiri: "char" ... kumpulkan dan kita punya "a array dua pointer ke array of forteen chars"char *str
daripadachar* str
. Berasal dari latar belakang Delphi / Pascal, saya sangat terbiasa dengan cara yang terakhir sampai saya menemukan jenis yang lebih kompleks. Cara sebelumnya masih terlihat jelek bagi saya, tetapi membuat tipe notasi lebih konsisten (IMO).Jawaban:
Jika Anda tidak ingin mengubah string, maka Anda bisa melakukannya
Ketika Anda melakukannya seperti ini, Anda akan mengalokasikan array dari dua pointer
const char
. Pointer ini kemudian akan diatur ke alamat string statis"blah"
dan"hmm"
.Jika Anda ingin dapat mengubah konten string yang sebenarnya, Anda harus melakukan sesuatu seperti
Ini akan mengalokasikan dua array berturut-turut
char
masing-masing 14 detik, setelah itu konten string statis akan disalin ke dalamnya.sumber
Ada beberapa cara untuk membuat array string di C. Jika semua string akan memiliki panjang yang sama (atau setidaknya memiliki panjang maksimum yang sama), Anda cukup mendeklarasikan array char 2-d dan menetapkan yang diperlukan:
Anda dapat menambahkan daftar inisialisasi juga:
Ini mengasumsikan ukuran dan jumlah string dalam initializer cocok dengan dimensi array Anda. Dalam hal ini, isi setiap string literal (yang merupakan array char yang diakhiri nol) disalin ke memori yang dialokasikan untuk strs. Masalah dengan pendekatan ini adalah kemungkinan fragmentasi internal; jika Anda memiliki 99 string yang terdiri dari 5 karakter atau kurang, tetapi 1 string yang panjangnya 20 karakter, 99 string akan memiliki setidaknya 15 karakter yang tidak digunakan; itu buang-buang ruang.
Alih-alih menggunakan array char 2-d, Anda dapat menyimpan array pointer 1-d untuk char:
Perhatikan bahwa dalam hal ini, Anda hanya mengalokasikan memori untuk menahan pointer ke string; memori untuk string itu sendiri harus dialokasikan di tempat lain (baik sebagai array statis atau dengan menggunakan
malloc()
ataucalloc()
). Anda dapat menggunakan daftar penginisialisasi seperti contoh sebelumnya:Alih-alih menyalin isi konstanta string, Anda hanya menyimpan pointer ke mereka. Perhatikan bahwa konstanta string mungkin tidak dapat ditulis; Anda dapat menetapkan ulang pointer, seperti:
Tetapi Anda mungkin tidak dapat mengubah konten string; yaitu,
mungkin tidak diizinkan.
Anda dapat menggunakan
malloc()
untuk mengalokasikan buffer secara dinamis untuk setiap string dan menyalin ke buffer itu:BTW,
Mendeklarasikan sebagai array 2 elemen pointer ke array 14 elemen char.
sumber
malloc
panggilan.T [N]
dikonversi ke ekspresi tipeT *
, dan nilai ekspresi adalah alamat elemen pertama. Jadi jika Anda menulisstr = "foo"
, Anda akan mencoba untuk menetapkan alamat karakter pertama"foo"
ke arraystr
, yang tidak berfungsi. Lihat jawaban ini untuk lebih jelasnya.char *strs[NUMBER_OF_STRINGS] = {0};
Ini membantu mencegah masalah di masa depan dengan menginisialisasistrs
keNULL
. Banyak orang membaca posting ini ketika google melakukan pencarian pada array string di C.Ack! String konstan:
Jika saya ingat dengan benar.
Oh, dan Anda ingin menggunakan strcpy untuk tugas, bukan operator =. strcpy_s lebih aman, tetapi tidak dalam standar C89 atau C99.
Perbarui: Thomas mengatakan
strlcpy
adalah cara untuk pergi.sumber
Berikut ini beberapa opsi Anda:
Keuntungannya
a2
adalah Anda kemudian dapat melakukan hal berikut dengan string literalDan untuk
a3
Anda dapat melakukan hal berikut:Untuk
a1
Anda harus menggunakanstrcpy()
(lebih baik lagistrncpy()
) bahkan ketika menetapkan string literal. Alasannya adalaha2
, dana3
adalah array dari pointer dan Anda dapat membuat elemen mereka (yaitu pointer) menunjuk ke penyimpanan apa pun, sedangkana1
array adalah 'array karakter' dan masing-masing elemen adalah array yang "memiliki" penyimpanannya sendiri ( yang berarti akan hancur ketika keluar dari ruang lingkup) - Anda hanya dapat menyalin barang ke penyimpanannya.Ini juga membawa kita pada kerugian menggunakan
a2
dana3
- karena mereka menunjuk ke penyimpanan statis (di mana string literal disimpan) konten yang tidak dapat diubah secara andal (yaitu perilaku tidak terdefinisi), jika Anda ingin menetapkan literal non-string ke elemena2
ataua3
- Anda pertama-tama harus secara dinamis mengalokasikan cukup memori dan kemudian elemen-elemennya menunjuk ke memori ini, dan kemudian menyalin karakter ke dalamnya - dan kemudian Anda harus memastikan untuk membatalkan alokasi memori setelah selesai.Bah - Saya sudah ketinggalan C ++;)
ps Beri tahu saya jika Anda membutuhkan contoh.
sumber
Atau Anda dapat mendeklarasikan tipe struct, yang berisi karakter arry (1 string), mereka membuat array struct dan dengan demikian array multi-elemen
Salah satu keuntungan dari ini dibandingkan metode lain adalah ini memungkinkan Anda untuk memindai langsung ke string tanpa harus menggunakan
strcpy
;sumber
Dalam ANSI C:
sumber
char* foo, bar;
apa jenisnyabar
?Jika senarnya statis, sebaiknya Anda menggunakan:
Meskipun bukan bagian dari ANSI C dasar, kemungkinan lingkungan Anda mendukung sintaks. String ini tidak dapat diubah (hanya-baca), dan dengan demikian di banyak lingkungan menggunakan lebih sedikit overhead daripada secara dinamis membangun array string.
Sebagai contoh dalam proyek mikro-controller kecil, sintaks ini menggunakan memori program daripada (biasanya) memori ram lebih berharga. AVR-C adalah contoh lingkungan yang mendukung sintaks ini, tetapi demikian juga sebagian besar yang lain.
sumber
Jika Anda tidak ingin melacak jumlah string dalam array dan ingin mengulanginya, cukup tambahkan string NULL pada akhirnya:
sumber
Literal string adalah
const char *
s.Dan penggunaan tanda kurung Anda aneh. Anda mungkin berarti
yang mendeklarasikan array dua pointer ke karakter konstan, dan menginisialisasi mereka untuk menunjuk pada dua konstanta string yang dikodekan dengan keras.
sumber
Kode Anda membuat array pointer fungsi. Mencoba
atau
sebagai gantinya.
Lihat wikibooks ke array dan pointer
sumber
halo kamu bisa coba di bawah ini:
contoh yang bagus dari penggunaan, array string di c jika Anda menginginkannya
sumber
Sini coba ini !!!
sumber
Saya kehilangan beberapa string yang lebih dinamis, di mana jumlah string dapat bervariasi tergantung pada pemilihan run-time, tetapi sebaliknya string harus diperbaiki.
Saya telah mengakhiri potongan kode pengkodean seperti ini:
char** ev
mengambil pointer ke array string, dan menghitung jumlah pengambilan string menggunakan_countof
fungsi. (Mirip dengansizeof(arr) / sizeof(arr[0])
).Dan ada tambahan Ansi untuk konversi unicode menggunakan
A2T
makro, tapi itu mungkin opsional untuk kasus Anda.sumber
Cara yang baik adalah dengan mendefinisikan string diri Anda.
Sangat sederhana.
sumber
;
, dan bagaimana ini membuat array string ?