“char”类型的参数与char类型的参数不兼容*

问题描述:

我不断收到此错误并不确定如何修复它。我是C编程新手,尝试通过书籍/互联网搜索,找不到太多帮助。我试图创建一个程序,将打印使用循环和sctructure“char”类型的参数与char类型的参数不兼容*

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct Grades 
{ 
    char Name[20]; 
    char Hrs; 
    int ID; 
    char ClassName[20]; 
    char Grade; 
    char ClassID[6]; 
}; 

int main() 
{ 
    struct Grades Transcript[6]; 
    int classCnt = 0; 
    int vHrs=0; 
    char vGrade[2]; 
    char vName[20], vCID[6], vClassName[20]; 

    printf("Enter Students Name: "); 
    fgets(vName, 20, stdin); 

    do 
    { printf("Enter Class ID; "); 
     fgets(vCID, 6, stdin); 
     strcpy_s(Transcript[classCnt].ClassID, vCID); 
     printf("Enter Class Name: "); 
     fgets(vClassName, 20, stdin); 
     strcpy_s(Transcript[classCnt].ClassName, vClassName); 
     printf("Enter Class Hours: "); 
     scanf("%d", &vHrs); 
     strcpy(Transcript[classCnt].Hrs, vHrs);   //Problem occurs here 
     printf("Enter Class Grade: "); 
     scanf("%c", vGrade); 
     strcpy(Transcript[classCnt].Grade, vGrade);  //Problem occurs here 
     classCnt++; 
    }while(classCnt<=6); 
} 
+3

'char'和'字符*'是两种不同的类型。了解差异只是你学习C时必须学习的第一件事。 – 2013-02-26 02:24:13

你正在运行到这里的东西是数据输入错误等级报告。

结构成员.Hrs"char"类型。 strcpy的论点是"char *"。可以这样想:A char是一个单一的8字节数字,代表ASCII码值。 A "char *"是指向字符数组(或C语言中的字符串)的指针。

上面传统上是正确的,但是,今天它也可能是一个unicode或多字节字符串。无论哪种情况,您需要的是赋值运算符(=),而不是strcpy

所以你告诉strcpy看看一个值(char),而不是一串值(char *),这是它期望的参数。在这种情况下,您可以直接复制用scanf扫描的整数值。

Transcript[classCnt].Hrs = vHrs; 

Transcript[classCnt].Grade = vGrade; 

如果你在我看来,寻找写过的最好的书,以及反正:-),C语言,请上网: C语言程序设计(第2版) - 看起来像是在亚马逊(或您最喜爱的二手书籍销售商)上提供的,价格约为21美元。

你确实有一些问题在这里:

首先,strcpy()用于复制一个字符串,如果你有一个角色,你想它分配给它,你可以简单地用=运营商分配给它。当你想要分配一个字符数组时,使用strcpy()函数。

所以,你的第一个问题

strcpy(Transcript[classCnt].Hrs, vHrs); 

Hrs从你的结构仅仅是一个char类型,vHrsint类型。你可以简单地分配给它喜欢:

Transcript[classCnt].Hrs = vHrs; 

然而,比char能,这将会给你一个关于溢出警告的int可以容纳更多的数据,你应该听它(取决于实施char保持-128至127,其中int保持-2,147,483,648至2,147,483,647)。决定你在这里真正想要的数据类型,并使HrsintvHrs a char然后只是做任务。

问题二:

scanf("%c", vGrade); 

vGrade作为一个字符数组(它是由多于一个字符的),这意味着你应该用字符串格式运算符"%s"分配给它,但是当你做一个字符串你应使阵列足够的字符数长,你要+ 1(为NULL结束)。

第三个问题:

strcpy(Transcript[classCnt].Grade, vGrade); 

GradecharvGrade是一个数组。同样,你必须做出类型的决定,如果你想要一个字符的“字符串”,那么你需要让他们两个数组,如果你想只是一个单一的字符,然后改变vGrade类型和做的=一个简单的赋值运营商。