我一直收到此错误,并且不确定如何修复它。我是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);
}
答案 0 :(得分:1)
你实际上有很多问题:
首先,strcpy()
用于复制字符串,如果您有一个字符并且希望它分配它,您可以简单地使用=
运算符进行分配。当您有要分配的字符数组时,将使用strcpy()
函数。
所以你的第一个问题
strcpy(Transcript[classCnt].Hrs, vHrs);
您的结构中的 Hrs
只是char
类型,vHrs
是int
类型。你可以简单地分配它:
Transcript[classCnt].Hrs = vHrs;
但是,int
可以容纳比char
更多的数据,这会给你一个关于溢出的警告,你应该听一下(取决于实现{{1}保持-128到127,其中char
保持-2,147,483,648到2,147,483,647)。在此处确定您真正想要的数据类型,并将int
设为Hrs
或int
设置为vHrs
,然后执行分配。
第二个问题:
char
scanf("%c", vGrade);
作为一个字符数组(它由多个字符组成)意味着你应该用字符串格式operator vGrade
赋值,但是当你做一个字符串时你应该数组的长度足以满足你想要的字符数+ 1(对于NULL终结符)。
第三个问题:
"%s"
strcpy(Transcript[classCnt].Grade, vGrade);
是Grade
,而char
是数组。同样,你必须做出类型的决定,如果你想要一个字符串“字符串”,那么你需要将它们作为两个数组,如果你只需要一个字符然后改变vGrade
的类型并做一个简单的使用vGrade
运算符进行分配。
答案 1 :(得分:0)
您遇到的事情是数据输入错误。
结构成员.Hrs
的类型为"char"
。 strcpy
的参数是"char *"
。可以这样想:char
是一个8字节的数字,表示ASCII中的值。 "char *"
是指向字符数组(或C语言的字符串)的指针。
以上传统上是正确的,但是,今天它也可能是一个unicode或多字节字符串。在任何一种情况下,您需要的是赋值运算符(=
),而不是strcpy
。
所以你告诉strcpy
查看单个值(char
),而不是一串值(char *
),它正是它所期望的参数。在这种情况下,您可以直接使用scanf
复制扫描的整数值。
Transcript[classCnt].Hrs = vHrs;
和
Transcript[classCnt].Grade = vGrade;
如果您正在寻找有史以来最好的书籍,我认为无论如何:-),C语言,请查看: C编程语言(第2版) - 看起来它可以在亚马逊(或您最喜欢的二手书销售商)上以约21美元(USD)的价格提供。