C'de bir dizenin tanımının özellikleri nelerdir?


10

Sınıflarımdan biri için bir ev ödevi sorusunu yanıtlamam gerekiyor. Özellikle, C'deki belirli dizilerin dize olarak kabul edilip edilmediğini söylemeliyim. Bu makaleye dayanarak ( https://www.geeksforgeeks.org/strings-in-c-2/ ) Dizelerin sonunda boş sonlandırıcılı bir dizi karakter olduğunu biliyorum.

Benim ana hangup soruya benziyor bir dizi soran bir parçasıdır:

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

Bu, sonunda boş bir sonlandırma karakteri olan bir karakter dizisidir. Bununla birlikte, ortasında boş bir sonlandırma karakteri olduğu için hala bir dize olarak kabul ediliyor mu? Bu ipi nasıl etkiler?

DÜZENLEME: Yorumlara dayanarak, sorunun gerçek ifadelerini sağladım:

Msgstr "Aşağıdaki dizilerden hangisi strcpy (), strncpy (), strcmp (), strncmp () ve benzer dize işlevlerine argüman olarak kullanmak amacıyla" dizeler "olarak kabul edilebilir (tüm uygulamaları belirtin)?"

DÜZENLEME: Soru belirsiz bir şekilde ifade edildiğinden beri profesörüme e-posta gönderdim (birkaç kişinin işaret ettiği gibi). Merak eden biri varsa, bana "Evet, bir dize. Anahtar, boş bir karakter olması. Ama elbette, herhangi bir dize işlemini etkileyecektir; dize null karakterle biter."


4
"CS"Birkaç baytlık çöp eklenmiş bir dize olduğunu söyleyebilirsiniz (bu durumda son NUL karakteri önemsizdir). Ama "bütün olarak" bir dize değildir. - Yine de, strcpybu işlevler vb "Bu "CS"kısmı sadece görmek" çünkü pc patlamaya yapmayacaktır .
Hagen von Eitzen

2
c1 kesinlikle bir argüman olarak kullanılabilir strcmp(). Dize işlevlerini değiştirmeye argüman olarak kullanılıp kullanılamayacağı, sağlanmayan ek faktörlere bağlıdır.
EOF

2
İçeriği c1değiştirilebilir, bu yüzden neden strcpykaynak dizesini barındırmak için yeterince büyük olmadığı sürece geçerli bir hedef bağımsız değişken veya benzer için başarısız olacağını görmüyorum . Bu bir ip değil, belirli bir amaç için uygun bir ip değil.
John Bollinger

1
Genel olarak, sorunun belirsiz bir şekilde ifade edildiğini kabul ediyorum. İfade c1, özel olarak adlandırılanlar da dahil olmak üzere tüm standart kitaplığın (dar) dize işlevlerine yönelik dize bağımsız değişkenleri için temel gereksinimleri karşılar, ancak davranış, arayanın beklediği veya istediği şey olmayabilir (hatta ortaya çıkarılabilen tanımlanmamış davranışları göz ardı ederek).
John Bollinger

1
Not tip ihtiyacı olmayabilir char. Herhangi bir karakter türü yapar.
chux - Monica adlı kişiyi geri yükle

Yanıtlar:


8

c1çoğunlukla [1] değerine eşittir &c1[0], bu da bir dizeyi tutarken "CS",.

İşte, işte gizlenen bir ikinci dize var "324", başlayan &c1[3]- ama sürece erişirken c1olarak c1, dize "CS"tüm fonksiyonlar olduğunu strcpy()vd. görecektim.


[1]: c1bir dizi, &c1[0]bir işaretçi.


Yani, c1bir strcpy()komutta hedef dize olarak kullanmak uygun mu? Soru belirsiz - en iyi ihtimalle.
Andrew Henle

1
Elbette c1her iki argüman olarak da kullanabilirsiniz strcpy(). Her anlamda sıradan bir ip. Sıradan teller genellikle sonlandırıcılarından sonra artık çöp içerir. Bu çöpün programa sabit bir şekilde kodlanmış olması, yazarın c1string olmayan yollarla kullanmayı düşündüğü izlenimini verir , ancak bu sorunun bir parçası değildi.
Lee Daniel Crocker

" yanılgı" c1eşdeğeridir &c1[0]. c1bir dizidir. &c1[0]bir işaretçi.
chux - Monica adlı kişiyi geri yükle

2

C'de bir dizenin tanımının özelliklerini bilmek istiyorsanız, kaynağa gidin.

C90 standardından :

7 Kütüphane

7.1 Giriş

Terimlerin 7.1.1 Tanımlar
Bir dizi birinci boş karakter içeren bir bitişik sona erdirildi karakter dizisi ve bir. Bir dizgeye “işaretçi”, ilk (en düşük adresli) karakterine bir işarettir. Bir dizenin "uzunluğu", boş karakterden önceki karakter sayısıdır ve "değeri", içerdiği karakterlerin değerlerinin sırasıyla sırasıdır.

(Sonraki standartlarda herhangi bir ilgili değişiklik olmamıştır.)

Bu nedenle, c1birbirini takip eden iki dizi içerir, "CS" ve "324", ancak kendisi bir dize değildir.

Bir diziyi bir işleve geçirirsek, ilk öğesinin bir işaretçisine bozulur, böylece +c1bir işaretçiyi dizeye bekleyen herhangi bir işlev için yeterince iyi olan bir dizeyi (ilki) gösterir. Bu bir "CS \ 0324" dizesini göstermez, ancak bu muhtemelen eğitmen sorunuz için yeterince iyidir, ki bu belirsizdir.


4
Bu tanımla bile, c1'in açıkça "CS" dizesi olduğunu iddia ediyorum. Dönemi. Sonlandırıcıdan sonra sıfır olmayan bayt içermesi gerçeği önemsizdir - birçok dize yaşamları boyunca böyle olacaktır.
Lee Daniel Crocker

+c1bir dizeyle işaret eder, çünkü c1bir dizeyle başlar. Bu hiçbir şekilde, şekil veya formda c1bir dize yapmaz .
Deduplicator

2
Sıfır baytla sonlandırılmış bazı karakterler içeren bir bellek bölümünün adresidir. Printf () sadece% s ile iyi olursa, strlen () 'e iletilen mükemmel bir sayı verir, strcpy ()' ye geçilirse çalışır. Vb. Bana bir dize gibi geliyor.
Lee Daniel Crocker


Elbette. Ancak diziler kesinlikle dizgiler olabilir.
Lee Daniel Crocker

0

@ DevSolar'ın cevabına ek olarak, eğer verilen dize ile oynadıktan sonra keşfettiğim bir şey:

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

Bu dizgenin çıktısını alırsanız CS03240, bu dizenin boyutu 7 olur. Anladığım kadarıyla \\0, boş karakteri ( yani \0 ) belirtmek için kullanılır . Yaparsan:

printf("\0");

Çıktı günlüğünde hiçbir şey görmezsiniz, ancak yaparsanız:

printf("\\0");

Gördüğünüz \0gibi, ters eğik çizgi veya tırnak işareti gibi özel karakterleri çıktılamak için beklenen bir şey \, bunlarla birlikte bir kullanmanız gerekir.

Beni şaşırtan bir şey çıktı CS03240ve boyutu 7'dir. Bir dizgenin boyutunun, içindeki karakter sayısı artı bir (boş karakter için) olduğu genel bir anlayıştır. Ayrıca, dize için bile boyut 7'dir char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };.

Belki de bu sorunun bir takibi, burada neler oluyor?


1
'\\0'boş bir karakter değil . Çok karakterli bir sabittir. Kesinlikle aralığı dışında bir uygulama tanımlı değere sahiptir char. boş karakter içermediğinden dizec1[] değildir . "bu dizeyi çıktıyorsunuz" büyük olasılıkla tanımlanmamış davranışa neden olur .
chux - Monica adlı kişiyi geri yükle

Çok karakterli sabitlere baksam da seni tam olarak anlamadım. C1 [], sonunda boş bir karakter olmadığı için bir dize değilse, neden OP tarafından gönderilen ilk durumda boyut 7 olarak çıkıyor?
rasengan__

char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };boyut 7 olduğundan, 7 değerle başlatıldığından. Bu boyut ile ilgisi yoktur dizeleri . char c1[] = { 1, 2, 3, 4, 5, 6, 7 };hala 7 boyuta
getirirdi

Dizide c1bir acı var mı? Bu ayrı bir konudur. Ayrıca bkz .
chux - Monica'yı yeniden
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.