Yine de, bir dizgenin değişmezi ile bir karakter dizisi başlatmak kötü bir uygulamadır.
Bu yorumun yazarı hiçbir zaman haklı çıkarmaz ve ifadeyi şaşırtıcı buluyorum.
C'de (ve bunu C olarak etiketlediniz), dizge değeri olan bir diziyi başlatmanın tek yolu bu char
(başlatma atamadan farklıdır). Ya yazabilirsiniz
char string[] = "october";
veya
char string[8] = "october";
veya
char string[MAX_MONTH_LENGTH] = "october";
İlk durumda, dizinin boyutu, başlatıcının boyutundan alınır. Dize değişmezleri, char
0 baytlık sonlandırıcı bir dizi halinde saklanır , bu nedenle dizinin boyutu 8'dir ('o', 'c', 't', 'o', 'b', 'e', 'r', 0). İkinci iki durumda, dizinin boyutu, bildirimin bir parçası olarak belirtilir (8 ve MAX_MONTH_LENGTH
, ne olursa olsun).
Ne olamaz yaptığı gibi yazma şeydir
char string[];
string = "october";
veya
char string[8];
string = "october";
vb İlk durumda, beyanı string
olduğunu tamamlanmamış hiçbir dizi boyutu belirtilen edildiği için ve gelen boyutunu almak için hiçbir başlatıcı var. Her iki durumda =
da işe yaramaz çünkü a) Bir dizinin ifadesi string
bir ödevin hedefi olmayabilir ve b) =
Operatör bir dizinin içeriğini bir başkasına kopyalamak için tanımlanmadı.
Aynı şekilde yazı yazamazsın.
char string[] = foo;
foo
başka bir dizi nerede char
. Bu başlatma şekli sadece string değişmezleri ile çalışacaktır.
DÜZENLE
Bunu, bir dizi-tarzı başlatıcıya sahip bir dize tutacak dizileri de başlatabileceğinizi söylemek için değiştirmeliyim.
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
veya
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
ancak sicim harflerini kullanmak gözler için daha kolaydır.
EDIT 2
Bir dizinin içeriğini bir bildirimin dışında atamak için ya strcpy/strncpy
(0-sonlandırılmış dizeler için) ya da memcpy
(diğer herhangi bir diziler için) kullanmanız gerekir:
if (sizeof string > strlen("october"))
strcpy(string, "october");
veya
strncpy(string, "october", sizeof string); // only copies as many characters as will
// fit in the target buffer; 0 terminator
// may not be copied, but the buffer is
// uselessly completely zeroed if the
// string is shorter!