2016-03-31 29 views
1
typedef struct Symbol{ 
    char varName[16]; 
} Symbol; 

............... 
Symbol *newSymbol = malloc(sizeof(Symbol)); 
const char space[2] = " "; 


char *String = "Name Test"; 

//break off the first word from String and put it into name 

char *name; 
name = strtok(String,space); 

//convert the char * to char[16] 

char nameArray[16]; 
strcpy(nameArray,name); 

//set newSymbol->varName to the newly created char[16] 

newSymbol->varName = nameArray 

oluşturma [] char. Benim gerçek programımda, fgets kullanarak bir dosyadan okunur, ben sadece bu örnekte "Adı Test" diyoruz. Dizenin ilk sözcüğünü almak ve Symbol içinde varName olarak atamak istiyorum. Yani ne olur? newSymbol->varName "Ad" olarak ayarlanmış. strtok, char * döndürdüğü için ancak char[16] yapısına ihtiyacım var, char * değerini char[16]'a dönüştürmeliyim.strcpy'nin bir <code>char *</code><code>String</code> adı sahip yanlış formu

"Error: incompatible types when assigning to type 'char[16]' from type 'char*' 
newSymbol -> varName = nameArray; 

Yani, aslında char[16] için char * dönüşmüyorsa strcpy gibi görünüyor:

Ancak, bu hatayı alabilirsiniz. Bir char[16] ilan edip strcpy'a char * içeriğini ekledikten sonra bile char[16] yerine char * var. Yapısını değiştirmeden çalışmam gerekiyor, bu yüzden burada bir seçenek değil.

char *3'ü char[16] içine nasıl dönüştürebilirim?

+2

Hmmm 'char * String =" Name Test "; ... name = strtok (String, space); 'bence, bir dizgeyi değiştirmeye çalışıyorum. – chux

+0

Oldukça doğru, @chux, fakat bunu, orijinal kodunu sunduğu örneğe indirgeme sürecinde ortaya çıkan bir hata olduğunu kabul ediyorum. –

cevap

2

Sen

diğer veri türleri için dizeleri strcpy ve memcpy/memset kullanabilirsiniz C

düzenli atama operatörü kullanılarak bir dizinin içeriğini tayin edemez.

yerine

newSymbol -> varName = nameArray; 

kullanımını (Sen de dizeleri memcpy/memset kullanabilirsiniz ama strcpy basittir)

strcpy(newSymbol -> varName, nameArray); 
+0

Bunu denedim ve işe yaradı, yardım için teşekkürler! –

+0

@JacobL., Rica ederim. –

2

So, it seems like strcpy it not actually converting the char* to a char[16].

Hayır, sorun C atamak için sağlamaz olmasıdır (bütün) diziler. newSymbol->varName, 16 char dizisidir. Bu dizinin öğelerine öğesini atayabilir ve buna strcpy() veya benzer bir işlevle kopyalayabilirsiniz, ancak tüm diziye atayamazsınız. Bu şekilde belirli kodunda

, bu değişen, değişken nameArray vazgeçmek istiyorum ...

strcpy(nameArray,name); 

...:

strcpy(newSymbol->varName, name); 

(Ya da belki benzer kullanımına strncpy(), dizi sınırlarını korumaktan korunmak için.)

İlgili konular