2013-08-13 31 views
5

Hala forumda yeni yaşıyorum, bu yüzden forum - görgü kuralları sorunları için şimdiden özür dilerim.Int/char dizileri/dizeleri arasındaki farklar

int dizileri ve char dizileri arasındaki farkları anlamakta sorun yaşıyorum.

Geçenlerde başlangıçta sayı dizisi depolamak için char dizisi kullanılan bir Proje Euler sorun için bir program yazdım ve daha sonra belirli karakterleri denilen ve bir ürünü bulmak için onlara int işlemleri kullanmaya çalıştı. Bir char dizisi kullandığımda gülünç derecede büyük bir ürün aldım, açıkça yanlış. Bir karakter olarak (str[n]) bir satır içi ((int)str[n]) derlendiğini düşündüğüm şeyi dönüştürdüysem de aynısını yaptım. Sadece bir tam sayı dizisi kullandığımda işe yaradı. Bu işe yaramadı char dize

char str[21] = "73167176531330624919"; 

için

şöyle

Kod olduğunu. Yaklaşık 40 tr civarında olması gereken bir cevap için yaklaşık 1,5 trilyonluk bir cevabım var. int dizide

int str[] = {7,3,1,6,7,1,7,6,5,3,1,3,3,0,6,2,4,9,1,9}; 

Bu çalışma yaptı budur için

. Ayrıca in-line tip dökümünü çıkardım.

Bu şeylerin neden işe yaradığı/çalışmadığı ve bu fikirlerin daha iyi anlaşılmasına yol açabilecek herhangi bir şey hakkında herhangi bir açıklama takdir edilecektir. Yararlı şeyler için bağlantılar da vardır. Dizeleri, dizileri ve işaretçileri bolca araştırdım (lisede olduğum için kendimi eğitiyorum) ama kavramlar hala kafa karıştırıcı.

Yan soru, C dizeleri otomatik olarak diziler halinde saklanır mı yoksa sadece bunu yapmak mümkün mü?

+3

Belki de [bu tablo] (http://www.asciitable.com), ascii karakterlerinin tedavisinde "int" değerleri olarak bir miktar ışık tutabilir. Ve evet, eğer 'dizi' ile altta yatan karakter verisini içeren bitişik belleği kastederseniz, bunlar (saklı bir 0-sonlandırıcı ile birlikte) saklanırlar. – WhozCraig

+0

bu tablo char '0' ın ​​int değeri 48'e karşılık geldiğini söylüyor mu? – Charles

+0

Evet, değeri imzasız olsa da, önemli görünmeyebilir, ancak genişletilmiş ascii karakterlerini işlemeniz gerekiyorsa bu durumda olacaktır (bunun hemen altındaki tabloya bakın). Doğru yoldasın. Aşağıda birkaç cevap daha iyi açıklıyor. Ayrıca bu ('0' == 48) sadece ASCII için doğru olduğunu unutmayın. Sisteme bağlı diğer karakter kümeleri vardır (örneğin [EBCDIC] (http://en.wikipedia.org/wiki/EBCDIC)). – WhozCraig

cevap

4

WhozCraig'ın cevabını incelemek için, sahip olduğunuz sorunun dizelerle değil, tek tek karakterlerle yapılması gerekmez.

C dizgileri, karakter dizileri (ve sonuçta boş sonlandırıcı var olan uyarı ile) olarak büyük ve büyük olarak saklanır. Karakterler kendilerini incih dilinde kullanılan karakterler için 0 - 127 arasında kodlar atan ascii adında bir sistemde kodlanırlar (sadece). Böylece "7", 7 olarak saklanmaz, ancak 7'nin ascii kodlaması olarak, 55.

Şimdi ürününüzün neden bu kadar büyük olduğunu görebilirsiniz. düzeltmek için

zarif bir yolu, bu çözüm karakterin için ASCII kodundan 0 ASCII kodu çıkarır

int num = (int) str[n]; 

int num = str[n] - '0'; 
//thanks for fixing, ' ' is used for characters, " " is used for strings 

için, "7" demek dönüştürmek olacaktır. Sayılar doğrusal olarak kodlandığından, bu (tek haneli sayılar için) çalışır.Daha büyük sayılar, bir boş sonlandırma bayt ile stdlib.h

+0

Kodu tekrar benim istediğim rakamlarıma dönüştürme fikrini beğendim. Dediğin gibi, zarif :) – Charles

+0

@ user2673602 Teşekkürler, Memnuniyetle yardımcı olabilirim! –

+1

Dönüşümler için ['strtol()'] (http://en.cppreference.com/w/c/string/byte/strtol) öneririm, ancak fikir var. – WhozCraig

3

Strings sadece karakter dizileri atoi veya strtol edilir kullanmalıdır. c. Içinde ayrı bir dize veri türü yok.

Bir char'i tam sayı olarak kullanırken, sayısal ascii değeri kullanılır. Örneğin, printf("%d\n", (int)'a'); gibi bir şey söylenirse, 97 ('a' ascii değeri) yazdırılır.

Tam sayı dizisine dönüştürmediğiniz sürece sayısal hesaplamaları yapmak için bir sayı dizisi kullanamazsınız. onun tamsayı forma bir karakter gibi bir rakam dönüştürmek için, böyle bir şey yapabilirsiniz: Bu ASCII değeri çıkarılacak '0' (48) ait ASCII değerini neden

char a = '2'; 
int a_num = a - '0'; 
//a_num now stores integer 2 

'2' (50) nihayet 2.

2
char str[21] = "73167176531330624919" 

bu kodu bırakarak str [21] saklanan her neyse

char str[21] = {'7','3','1','6','7','1','7','6','5',/ 
       '3','1','3','3','0','6','2','4','9','1','9'} 

eşdeğerdir sayılar değil, karakter (ASCII eşdeğer gösterimi farklıdır).

yan soru yanıtı - evet/hayır, dizeler otomatik olarak karakter dizileri olarak saklanır, ancak dizenin son öğe olarak ek bir karakteri ('\ 0') vardır (bir char dizisinin böyle bir dizinin olmaması gerekir)).

İlgili konular