【问题标题】:Argument of type "char" is incompatible with parameter of type char*“char”类型的参数与 char* 类型的参数不兼容
【发布时间】:2013-02-26 02:22:34
【问题描述】:

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

【问题讨论】:

  • charchar* 是两种不同的类型。在学习 C 时,首先要了解的就是了解其中的区别。

标签: c visual-studio-2010


【解决方案1】:

你实际上有很多问题:

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

所以你的第一个问题

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

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

Transcript[classCnt].Hrs = vHrs;

但是,int 可以容纳比 char 更多的数据,这会给你一个溢出警告,你应该听它(取决于实现 char 持有 -128 到127,其中int 持有 -2,147,483,648 到 2,147,483,647)。在此处确定您真正想要的数据类型,然后将Hrs 设为intvHrs 设为char,然后进行分配。

第二个问题:

scanf("%c", vGrade);

vGrade 作为一个字符数组(它由多个字符组成),这意味着你应该用字符串格式运算符"%s" 来分配它,但是当你做一个字符串时,你应该使数组足够长您想要的字符数 + 1(对于 NULL 终止符)。

第三题:

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

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

【讨论】:

    【解决方案2】:

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

    结构成员.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 美元(美元)的价格买到。

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 2016-05-19
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 2017-01-17
      相关资源
      最近更新 更多