0

我不断收到此错误,不确定如何解决。我是 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);
}
4

2 回答 2

1

您实际上在这里遇到了许多问题:

首先,strcpy()用于复制一个字符串,如果你有一个字符并且你想要它分配它,你可以简单地用=操作符分配它。strcpy()当您有要分配的字符数组时使用该函数。

所以你的第一个问题

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

Hrsfrom 你的结构只是一种char类型,而且vHrs是一种int类型。您可以像这样简单地分配它:

Transcript[classCnt].Hrs = vHrs;

然而,一个int罐子比罐子容纳更多的数据char,这会给你一个关于溢出的警告,你应该听它(取决于实现char持有 -128 到 127,其中int持有 -2,147,483,648 到 2,147,483,647)。在此处确定您真正想要的数据类型,然后进行Hrs赋值int或赋值。vHrschar

第二个问题:

scanf("%c", vGrade);

vGrade作为一个字符数组(它由多个字符组成),这意味着您应该使用字符串格式运算符对其进行分配"%s",但是当您执行字符串时,您应该使数组足够长以容纳所需的字符数 + 1 (对于 NULL 终止符)。

第三个问题:

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

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

于 2013-02-26T02:35:58.127 回答
0

您在这里遇到的是数据输入错误。

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

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

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

Transcript[classCnt].Hrs = vHrs;

Transcript[classCnt].Grade = vGrade;

如果您正在寻找有史以来最好的书,无论如何我认为 :-),关于 C 语言,请查看:C 编程语言(第 2 版)- 看起来它可以在亚马逊上找到(或者在您最喜欢使用的地方)书商)约 21 美元(美元)。

于 2013-02-26T02:33:17.423 回答