2010-11-16 22 views
6

Ben C yapılar hakkında öğrenmeye çalışıyorum, ama i olarak benim örnek başlık atanamıyor neden ben anlamıyorum:C yapı sorunu

#include <stdio.h> 

struct book_information { 
char title[100]; 
int year; 
int page_count; 
}my_library; 


main() 
{ 

my_library.title = "Book Title"; // Problem is here, but why? 
my_library.year = 2005; 
my_library.page_count = 944; 

printf("\nTitle: %s\nYear: %d\nPage count: %d\n", my_library.title, my_library.year, my_library.page_count); 
return 0; 
} 

Hata mesajı:

books.c: In function ‘main’: 
books.c:13: error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’ 

cevap

9

LHS bir dizidir, RHS bir işaretçidir. Noktalı baytları diziye eklemek için strcpy kullanmanız gerekir.

strcpy(my_library.title, "Book Title"); 

bir dize sonlandırıcı boş ('\ 0') karakter için yer ihtiyacı olarak uzun süredir burada kaynak veri> 99 byte kopyalamaya yok özen gösterin. tekrar orijinal kodu

error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’

bak ve bu şimdi daha mantıklı olmadığını görmek:

derleyici bazı ayrıntılı olarak neyin yanlış olduğunu söylemeye çalışıyordu.

+0

Teşekkür ederim, "#include " ekledikten sonra program derler ve beklendiği gibi çalışır. Bulduğum tüm örnekler, scanf kullanıyor ya da dizeleri dolduracak ve bu şimdi bana mantıklı geliyor. –

+0

Teşekkürler Peter. Giriş verilerinizin her zaman sığacak kadar küçük olduğundan emin olmadığınız sürece, "strncpy" alternatiflerini düşünürdüm. –

+0

strings.h dahil olmak üzere uygulama üzerinde çalışmaya rağmen, gerçekten strcpy bildirmek için string.h dahil olmalıdır. –

6

İleti yazarken, sorun uyumsuz türler atamaya çalışıyorsunuz: char* ve char[100]. Sen 2

strncpy(my_library.title, "Book Title", sizeof(my_library.title)); 
+2

'sizeof (my_library.title) -1 ', hayır? –

+0

@Oli, aslında. Zihinsel site üzerinden kendimi çuvalladı. – JaredPar

1

char * ve char [100] farklı türleri vardır arasında veri kopyalamak için strncpy gibi bir işlevi kullanmak gerekir.

Bu char öğelerini .title arabelleğinin içine kopyalamak istiyorsunuz.

strncpy(my_library.title, "Book Title", sizeof(my_library.title)); 
3

title bir karakter dizisi olduğu - bu C Kullanım strcpy(3) atanabilir değildir.