Bir char dizisi nasıl boşaltılır?


86

Char üyeleri [255] gibi bir karakter dizisine sahip olun. Bir döngü kullanmadan nasıl tamamen boşaltabilirim?

"Boş" derken kastettiğim, eğer içinde saklanan bazı değerler varsa, o zaman olmamalıdır. Örneğin strcat yaparsam eski değer kalmamalı


3
"Bir diziyi boşalt" derken ne demek istiyorsun?
pmg

4
üyeler [0] = üyeler [1] = üyeler [2] = üyeler [3] ... = üyeler [255] = 0 döngü yok;)
John La Rooy

18
Yani sizin "dizi" özel bir tür dizidir: o bir string. Bir dizeyi "boşaltmak" için, ilk elemanını "\ 0" olarak ayarlayın:members[0] = '\0';
pmg

Topluluk memset'ten yana görünüyor. Ancak gereksinimlerime göre en verimli yol bu mu?
Alex Xander

2
@Alex Xander: "Topluluk" bu durumda açıkça yanlış. 'Memset'i çağıran durumlar vardır (yetkisiz kullanımı önlemek için verileri silmek gibi), ancak basit dize sıfırlaması için (sizin durumunuzda olduğu gibi) doğru cevap yalnızca ilk öğeyi sıfırlamaktır.
AnT

Yanıtlar:


173

kullanma

Genel olarak

dizi kapsam içindeyse veya

yalnızca işaretçi değerine sahipseniz ve nMembers dizideki öğelerin sayısıdır.


DÜZENLEME Elbette, artık gereksinim bir diziyi temizleme genel görevinden tamamen bir dizeyi sıfırlamaya değişti memset, aşırı ve sadece ilk öğeyi sıfırlamak yeterli (diğer yanıtlarda belirtildiği gibi).


EDIT memset kullanmak için string.h eklemeniz gerekir .


6
+1 - Tüm dizi elemanlarının bilinen bir durumda olmasını sağladığından bunu tercih ederim.
ChrisBD

Yine de (epik) döngü kullanmama gerekliliğine aykırıdır.
Michael Foukarakis

1
Memset muhtemelen bir özyineleme olarak uygulanmasa da, her iki durumda da yineleme, görünüşte gerekli olan gözden uzak bir şekilde gizlenmiş olabilir.
Steve Gilham

37

'Boş' ile ne demek istediğine bağlı:


3
Bu sadece üyelerin [0] değerini değiştirir, üyeler [1] aracılığıyla [254] üyelerin değerini değiştirmez. Sırayla erişiyorsanız sorun yok ... ancak diğer durumlarda o kadar iyi değil.
Thomas Owens

3
OP'nin düzenlemesinden sonra, strcat () NULL baytını bulacağından ve ona göre davranacağından, benim çözümüm onun gereksinimleri için çalışacak gibi görünüyor.
Felix

3
Daha iyi bir çözüm değil. Sadece farklı bir soruna çözüm.
ypnos

4
C'de soyut bir diziyi "boşaltmanın" bir yolu yoktur. Her dizi, sıfır olsa bile bir şeyi sabitler. "Bir diziyi boşaltma" kavramı, yalnızca dizi içeriklerinin daha yüksek seviyeli mantıksal yorumlarına uygulanabilir. Örneğin, dizinin içeriği bir C-dizesi olarak yorumlanabilir. Bu durumda "boşaltmanın" en uygun yolu ilk öğeyi "\ 0" olarak ayarlamaktır. Tam olarak Felix'in yaptığı gibi. OP'nin aklında başka hangi yorumlar olabileceğini bilmiyorum, ama daha spesifik hale getirmeden, 'memset' ile yapılan tüm bu girişimler anlamsız bir soruya sadece anlamsız cevaplardır.
AnT

1
@tinkertim: Burada NULL yok. Ve hayır, 'strcat' NULL ile nasıl başa çıkılacağını bilmiyor. NULL geçerseniz çökecektir.
AnT

9

Dizelerle uğraşıyorsanız, karakter dizinizi sıfırlamaya çalışmayın. Aşağıda, char dizeleriyle çalışmanın basit bir yolu verilmiştir.

Kopyala (yeni dizge ata):

Birleştir (dizeyi ekleyin):

Boş dize:

Bu kadar basit.


8

karakter üyeleri [255] = {0};


1
Hayır, çünkü başlattıktan sonra yapılması gerektiğini belirtmedi. Özellikle bu, düzenlemeden önceki ilk örneğinden anlaşılmış olabilir ve bir diziyi temizlemek için çok yaygın bir durum olduğu için.
user44556

Sana verdiği tazminat olarak +2 veriyorum -1: P: D
stviper

5

DÜZENLEME: Soruya yapılan en son düzenleme göz önüne alındığında, bu artık boş sonlandırma olmadığı için çalışmayacaktır - diziyi yazdırmaya çalışırsanız, karakterlerinizi ve ardından insan tarafından okunamayan bir dizi karakter alırsınız. Ancak, bu yanıtı gelecek nesillere topluluk wiki olarak bırakıyorum.

Bu çalışmalı. C Programlama Diline Göre:

Dizinin sabit boyutu varsa, başlatıcıların sayısı dizinin üye sayısını aşamaz; daha az varsa, kalan üyeler 0 ile başlatılır.

Bu, dizinin her elemanının 0 değerine sahip olacağı anlamına gelir. Bunun "boş" olarak değerlendirilip değerlendirilmeyeceğinden emin değilim, çünkü 0 a için geçerli bir değerdir char.


"Boş" u nasıl tanımladığınıza bağlıdır. 0 değerine sahip karakter, insan tarafından okunabilir bir karakter değildir ve karakter dizisi bilinen bir durumdadır. Bunun boş olduğunu düşünürdüm. Ayrıca memset ile aynı şeyi yapar (eğer memset'i hatırlamam doğruysa - C'yi kullanmayalı çok uzun zaman oldu).
Thomas Owens

3

Bir diziyi bu şekilde boşaltamazsınız, her zaman aynı miktarda veri içerir.

Daha büyük bir bağlamda, dizideki veriler boş bir öğe listesini temsil edebilir, ancak bu, diziye ek olarak tanımlanmalıdır. Bunu yapmanın en yaygın yolları, bir dizi geçerli öğe tutmak (pmg ile verilen yanıta bakın) veya dizelerin bunları sıfır karakteriyle sonlandırmasıdır (Felix'in cevabı). Daha karmaşık yollar da vardır, örneğin bir halka tamponu, verilerin eklendiği ve kaldırıldığı konumlar için iki endeks kullanır.


3

gereksinimleriniz göz önüne alındığında yeterlidir.

Ancak bunun arabelleği "boşaltmadığına" dikkat edin. Bellek hala tahsis edilmiştir, içinde hala geçerli karakter değerleri olabilir ve bu böyle devam eder ..


1
* Üye = 0 olarak da yazılabilir;
eyalm

Hatta 0geçerli bir karakterdir. membersC dizesi olarak değerlendirilip değerlendirilmediğini bilmiyoruz .
Sany


2

İle giderdim


OP, bir C dizisinin parçası olmayan bir işlem (boşaltma) istediğinden, aslında çok mantıklı geliyor - bu nedenle, ideal olarak, yeni bir veri yapısı uygular ve pmg'nin yapıyı işaret etme yöntemi boştur. yeterince iyi.
Michael Foukarakis

Hayır, gerçekten mantıklı değil.

Kinopiko: Görünüşe göre yaklaşımı anlamıyorsun
Christian

Kinopiko: mantığımı bir yorumda açıklayabileceğimden daha iyi açıkladığı için starblue cevabını okuyun (teşekkürler
starblue

Hmm, bu ilginç bir yaklaşım, members_in_use hala bir dizi olacak mı? Daha sonra bir yapabilir miyim; member_in_use [5] = değer? Bu memset'e eşdeğer mi (members_in_use, 0, 255); Steve'in belirttiği gibi? Öyleyse, neden diğerinin yerine birini kullanasınız?

1

"Bir diziyi boşalt" derken 0'a sıfırlamayı kastediyorsanız, bzero'yu kullanabilirsiniz.

Diziyi başka bir varsayılan karakterle doldurmak istiyorsanız, memset işlevini kullanabilirsiniz.


bzero ve memset (genellikle) bir döngü kullanır.
Michael Foukarakis

1

daha basit daha iyidir - mantıklı mı?

bu durumda sadece üye [0] = 0 çalışır. basit bir soruyu bu kadar karmaşık hale getirmeyin.


0

Feragatname: Genellikle C dilinde programlama yapmıyorum, bu yüzden örneklerimde herhangi bir sözdizimi hatası olabilir, ancak ifade etmeye çalıştığım fikirlerin açık olduğunu umuyorum.

"Boşaltma", "boş bir dize içeren" anlamına geliyorsa, ilk dizi öğesini sıfıra atayabilirsiniz, bu da dizinin bir empry dizesi içermesini sağlar:

"Boşaltmak", "kullandığı belleği serbest bırakmak" anlamına geliyorsa, ilk etapta sabit bir karakter dizisi kullanmamalısınız. Bunun yerine, char için bir işaretçi tanımlamalı ve uygun şekilde malloc / free (veya dize ataması) yapmalısınız.

Yalnızca statik dizelerin kullanıldığı bir örnek:


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.