Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类型为“的参数”;char";与char类型的参数不兼容*_C_Visual Studio 2010 - Fatal编程技术网

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

类型为“的参数”;char";与char类型的参数不兼容*,c,visual-studio-2010,C,Visual Studio 2010,我一直收到这个错误,不确定如何修复它。我是C编程新手,曾尝试在书/网上搜索,但找不到太多帮助。我正在尝试创建一个程序,使用循环和结构打印成绩报告 #include <stdio.h> #include <stdlib.h> #include <string.h> struct Grades { char Name[20]; char Hrs; int ID; char ClassName[20]; char Grade

我一直收到这个错误,不确定如何修复它。我是C编程新手,曾尝试在书/网上搜索,但找不到太多帮助。我正在尝试创建一个程序,使用循环和结构打印成绩报告

#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);
}
#包括
#包括
#包括
结构等级
{
字符名[20];
半焦小时;
int-ID;
字符类名称[20];
煤焦品位;
char-ClassID[6];
};
int main()
{
结构等级成绩单[6];
int classCnt=0;
int vHrs=0;
炭级[2];
char vName[20]、vCID[6]、vClassName[20];
printf(“输入学生姓名:”);
fgets(vName,20,stdin);
做
{printf(“输入类ID;”);
fgets(vCID,6,标准输入);
strcpy_s(转录本[classCnt].ClassID,vCID);
printf(“输入类名:”);
fgets(vClassName,20,标准输入);
strcpy_s(成绩单[classCnt].ClassName,vClassName);
printf(“输入课时:”);
扫描频率(“%d”和vHrs);
strcpy(成绩单[classCnt].Hrs,vHrs);//这里出现了问题
printf(“输入等级:”);
scanf(“%c”,vGrade);
strcpy(成绩单[classCnt].Grade,vGrade);//这里出现问题
classCnt++;

}而(classCnt您在这里遇到的是一个数据输入错误

结构成员
.Hrs
的类型为
“char”
strcpy
的参数是
“char*”
。可以这样想:
char
是一个8字节的数字,表示ASCII中的值。
char*“
是指向字符数组(或C语言中的字符串)的指针

上述内容在传统上是正确的,但今天它也可能是unicode或多字节字符串。在这两种情况下,您需要的是赋值运算符(
=
),而不是strcpy

因此,您告诉
strcpy
查看单个值(
char
),而不是作为参数的字符串(
char*
),在这种情况下,您可以直接复制使用
scanf
扫描的整数的值

Transcript[classCnt].Hrs = vHrs;

如果您正在寻找有史以来写得最好的关于C语言的书,我认为:-),请查看:
C编程语言(第二版)-看起来它在亚马逊(或你最喜欢的二手书销售商)上可以买到,价格大约为21美元。

你在这里确实有很多问题:

首先,用于复制字符串,如果您有一个字符并且希望它分配给您,您只需使用
=
运算符分配它即可。当您有一个要分配的字符数组时,将使用此函数

那么你的第一个问题是什么

strcpy(Transcript[classCnt].Hrs, vHrs);
结构中的
Hrs
只是一个
char
类型,而
vHrs
是一个
int
类型。您可以简单地如下分配它:

Transcript[classCnt].Hrs = vHrs;
但是,
int
可以比
char
保存更多的数据,这会给您一个关于溢出的警告,您应该听它(取决于
char
保存的实现-128到127,其中as
int
保存)−2147483648到2147483647)。在此处确定您真正需要的数据类型,然后将
Hrs
an
int
vHrs
a
char
进行赋值

第二个问题:

scanf("%c", vGrade);
strcpy(Transcript[classCnt].Grade, vGrade);
vGrade
作为一个字符数组(它由多个字符组成),这意味着您应该使用字符串格式运算符
“%s”
,但是当您执行字符串时,您应该使数组足够长,以满足所需字符数+1(对于空终止符)

第三个问题:

scanf("%c", vGrade);
strcpy(Transcript[classCnt].Grade, vGrade);

Grade
是一个
char
vGrade
是一个数组。同样,如果你想要一个“字符串”,你必须决定类型如果只需要一个字符,那么就需要将它们都设置为数组,然后更改
vGrade
的类型,并使用
=
运算符进行简单赋值。

char
char*
是两种不同的类型。理解这两种类型之间的差异是在阿宁C。