2013-03-28 129 views
1

錯誤C2440: '=':無法從 '詮釋' 轉換爲 '的char [5]' 幫我)錯誤C2440: '=':無法從 '詮釋' 轉換爲 '的char [5]'

char type[5]; 
    switch (rec[n-1].recptr->qtype) 
    { 
     case 'p':type='pcs'; break; //here is problem 
     case 'm':type='kgs'; break; // and here is too 
     default: printf("incorrect code");break; 
    } 
+0

即使使用正確的文字類型,也不能這樣做。使用'std :: string'。 – chris

+1

那麼,取決於這是C還是C++,std :: string可能不是一個選項。 – Inisheer

+1

''pcs''是一個多字符字符常量,它有一個實現定義的類型爲'int'的值。這是一種非常少用的語言功能,但它可能會產生令人困惑的錯誤消息(如果特別不幸的話,根本沒有錯誤消息)。 –

回答

5

首先,字符串用雙引號",而不是單引號'。其次,要指定char[]陣列,您必須使用像strcpy()這樣的函數。您不能直接將數組分配給=

case 'p': strcpy(type, "pcs"); break; 
case 'm': strcpy(type, "kgs"); break; 
+0

更好地使用strncpy! – 4pie0

+0

它正在工作,thx) – Alewenka

+1

@ cf16:不,對於字符串,「strncpy'是* not *。 – md5

4

首先,'pcs'是一個字符常量,而你想要一個字符串。語法是"pcs"

此外,type是一個數組,所以當它不與sizeof_Alignof或一元運算符&使用時,它衰減到一個指針,它是不左值。因此,您不能重新分配type

strcpy可能是一個解決方案。

#include <string.h> 

char type[5]; 

switch (rec[n-1].recptr->qtype) 
{ 
    case 'p': 
     strcpy(type,"pcs"); 
     break; 
    case 'm': 
     strcpy(type,"kgs"); 
     break; 
    default: 
     printf("incorrect code"); 
     break; 
} 

或者,使用字符串litterals(如果你不修改type):

const char *type; 
switch (rec[n-1].recptr->qtype) 
{ 
    case 'p': 
     type="pcs"; 
     break; 
    case 'm': 
     type="kgs"; 
     break; 
    default: 
     printf("incorrect code"); 
     break; 
} 

參考

C11(n1570),第6.3.2.1左值,數組和函數指示符

除了當它是sizeof運算符的操作數時,_Alignof 運算符,或者是一元運算符&,或者是用於初始化數組的字符串文字,具有類型爲'''的數組的類型爲 的表達式轉換爲類型爲''的表達式,指向類型爲''的表達式將 指向數組對象的初始元素,並且不是左值。

0

使用strcpy(type,「pcs」)和strcpy(type,「kgs」)或std:string,你不能在數組中複製字符!

1

'pcs'int類型的多字符文字。

type是一個數組。你不能用=分配任何東西給整個數組。

[從技術上講,表達式type表現爲指向數組第一個元素的不可修改的指針,但不能修改不可修改的值。]

+0

''pcs''的類型爲int '也用C++。 – ouah

+0

@ouah但是''p''是C++中的'char',不是嗎? –

+0

@ouah你說得對。固定。 –

0

請使用strcpy的,你不能分配到char [5] =

case 'p': strcpy(type, "pcs"); break; 

,但如果你想避免的strcpy(即使在這樣的理論上安全的情況下),你可以做到這一點也這樣說:

/* partial copy (only 3 chars): */ 
    strncpy (type, "pcs", 3); 
    type[4] = '\0'; /* null character manually added */ 
+2

你必須非常小心''strncpy()'。如果截斷,它不會終止。 –

+0

我已經改變了,雖然我有,如果你使用字符串比緩衝區越大的strcpy的花瓶,你真的是運氣,但在strncpy()函數將在安全的方式進行處理的情況下,以檢查此 – 4pie0

+0

@FredLarson:什麼是更好的是明顯 – 4pie0

0

如果你能保持爲sizeof(int)的字符或更少,你可以這樣做以下:

int type; 
switch (rec[n-1].recptr->qtype) 
{ 
    case 'p':type='pcs'; break; //here is problem 
    case 'm':type='kgs'; break; // and here is too 
    default: printf("incorrect code");break; 
} 

上面的代碼沒有測試過,雖然我沒有測試這一點:

int main(int argc, char **argv) 
{ 
    int t; 
    t = 'abcd'; 
    printf ("t = %x\n", t); 
    t = 'dcba'; 
    printf ("t = %x\n", t); 
} 

[347] ~/tmp: ./a.out 
t = 61626364 
t = 64636261 

你真的要小心這裏,雖然你在這裏不使用>的sizeof(int)的字符。我懷疑每個編譯器的實際發生里程會有所不同。使用這種方法可以擺脫其他答案中浮現的所有額外字符串擔憂。

相關問題