帮助解决c错误

时间:2011-05-09 11:47:54

标签: c++ c arrays malloc strcpy

收到此错误:

1>c:\users\b1021568\documents\visual
     

studio 2010 \ projects \ tarefa42 \ tarefa
  42 \ main.cpp(112):错误C2664:   'cria_aluno':无法转换   参数2从'const char [7]'到   “字符”       1 GT;没有可以进行此转换的上下文

尝试编译时:

int main(void)
{
    Aluno *a[5];

    a[0] = cria_aluno(1, "turma1", "Joao", 7.0, 8.4, 4.3);
    a[1] = cria_aluno(2, "turma2", "Maria", 3.2, 5.1, 10.0);
    a[2] = cria_aluno(3, "turma3", "Rafael", 8.1, 3.2, 4.5);
    a[3] = cria_aluno(4, "turma4", "Jose", 1.3, 7.7, 9.3);
    a[4] = cria_aluno(5, "turma5", "Lais", 4.5, 1.3, 9.9);

    ordena(5, a);
return 0;
}

那是我的cria_aluno函数:

Aluno *cria_aluno(int mat, char turma, char nome, float p1, float p2, float p3)
{
    Aluno *a;

    a = (Aluno*) malloc(sizeof(Aluno));
    if(a == NULL)
    {
        printf("Memoria insuficiente");
        return NULL;
    }
    a->mat = mat;
    a->turma = turma;
    strcpy(a->nome, nome);
    a->p1 = p1;
    a->p2 = p2;
    a->p3 = p3;
    return a;
}

4 个答案:

答案 0 :(得分:3)

将其更改为

Aluno *cria_aluno(int mat, const char* turma, const char* nome, float p1, float p2, float p3)

“turma1”等属于const char*类型,而不是char

答案 1 :(得分:1)

更改

Aluno *cria_aluno(int mat, char turma, char nome, float p1, float p2, float p3)

Aluno *cria_aluno(int mat, const char* turma, const char* nome, float p1, 
                  float p2, float p3)
{
   Aluno *a = (Aluno*) malloc(sizeof(Aluno));
   if(a == NULL)
   {
      printf("Memoria insuficiente");
      return NULL;
   }
   a->mat = mat;
   a->turma = malloc(strlen(turma)+1);
   strcpy(a->turma, turma);
   a->nome = malloc(strlen(nome)+1);
   strcpy(a->nome, nome);
   a->p1 = p1;
   a->p2 = p2;
   a->p3 = p3;
   return a;
}

答案 2 :(得分:1)

你的函数期望参数2和3 char类型而不是char指针(char *,通常用作“string”)。

在你的main函数中,你使用char * type(string)作为参数2和3调用cria_aluno,这是导致错误的原因。

首先,您需要确定您希望在Aluno结构中存储的内容。让我们以turma为例:

如果您希望存储单个字符,则应使用char作为结构和函数中的turma类型。此外,在函数调用中,您应该使用单个字符作为参数2,例如:'a'。要复制此角色,您应该使用简单的副本:a-> turma = turma;

如果您希望存储字符串,则应使用char [x](其中x是最大字符串长度+末尾的\ 0)作为结构中的turma类型。在函数中,你应该使用char *(const char *会更好)。在函数调用中,您可以使用字符串(例如:“example”)。要复制此属性,您应该使用strcpy。

将结构中的turma存储为字符串模式的另一种方法是将结构中的类型更改为char *。然后,在需要时,分配内存。

祝你好运

阿米尔

答案 3 :(得分:0)

在函数调用中

a[0] = cria_aluno(1, "turma1", "Joao", 7.0, 8.4, 4.3); 

"turma1""Joao"字符串文字,它们是char(C ++中的const char)的数组。这两个表达式的类型分别为char [7]char [5]。这些类型与char不兼容,turmanomecria_aluno的{​​{1}},因此错误。

在大多数情况下,数组表达式的类型会隐式地从“{-1}}的N元素数组”转换为“指向T的指针”。那么实际传递给T的是两个cria_aluno类型的表达式,而不是char *。因此,您需要将char的声明更改为

cria_aluno

为什么Aluno *cria_aluno(int mat, const char *turma, const char *nome, float p1, float p2, float p3) 代替const char *?这有助于防止您意外修改指针指向的内容;尝试修改字符串文字的内容会导致未定义的行为。