错误C2440:'=':无法从'int'转换为'char [5]'

时间:2013-03-28 18:00:51

标签: c++ c visual-studio-2008

错误C2440:'=':无法从'int'转换为'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;
    }

6 个答案:

答案 0 :(得分:5)

首先,字符串采用双引号",而不是单引号'。其次,要分配到char[]数组,您必须使用strcpy()之类的函数。您不能使用=直接分配给数组。

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

答案 1 :(得分: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   运算符,或一元&运算符,或者是用于的字符串文字   初始化一个数组,一个类型为''array of type''的表达式   转换为类型为''指向类型'指针的表达式                  到数组对象的初始元素,而不是左值。

答案 2 :(得分:1)

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

type是一个数组。您无法使用=为整个数组指定任何内容。

[从技术上讲,表达式type表现为指向数组第一个元素的不可修改的指针,但是你不能修改不可修改的值。]

答案 3 :(得分:0)

使用strcpy(type,“pcs”)和strcpy(type,“kgs”)或std:string,只能通过赋值来复制数组中的字符!

答案 4 :(得分: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 */

答案 5 :(得分: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

虽然你不使用&gt;但你必须要小心。 sizeof(int)字符在这里。我怀疑每个编译器的里程数可能因实际情况而异。使用此方法可以消除在其他答案中浮动的所有额外字符串忧虑。