1

エラー 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;
    }
4

6 に答える 6

5

まず、文字列は一重引用符"ではなく二重引用符で囲みます'。次に、char[]配列に代入するには、 のような関数を使用する必要がありますstrcpy()。を使用して配列に直接代入することはできません=

case 'p': strcpy(type, "pcs"); break;
case 'm': strcpy(type, "kgs"); break;
于 2013-03-28T18:02:22.247 に答える
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;
}

または、文字列リテラルを使用して (変更しない場合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'' 型の式は '' 型の式に変換されます。配列オブジェクトの最初の要素を指し、左辺値ではない type'' へのポインター。

于 2013-03-28T18:02:36.393 に答える
1

'pcs'タイプ の複数文字リテラルですint

type配列です。を使用して配列全体に何かを割り当てることはできません=

[技術的に言えば、その式typeは配列の最初の要素を指す変更不可能なポインターとして動作しますが、変更不可能な値を変更することはできません。]

于 2013-03-28T18:03:58.290 に答える
0

strcpy(type, "pcs") と strcpy(type, "kgs") または std:string を使用すると、割り当てだけでは配列内の文字をコピーできません!

于 2013-03-28T18:03:49.590 に答える
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 */
于 2013-03-28T18:05:55.943 に答える
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) 文字を使用しないように注意する必要があります。実際に何が起こるかについて、マイレージはコンパイラごとに異なる可能性があると思います。この方法を使用すると、他の回答に浮かんでいる余分な文字列の心配をすべて取り除くことができます。

于 2013-03-28T20:37:21.230 に答える