【问题标题】:There is an C function with pointers and a char return, what only returns the char value and 0 to the pointers有一个带有指针和 char 返回的 C 函数,它只返回 char 值和 0 给指针
【发布时间】:2019-11-02 20:35:43
【问题描述】:

这里的目标是打印一个基于平均音符的等级(A、R 或 F),一个值表示存在,另一个表示平均音符,使用指向 avg 和存在的指针。但是编译后只打印char返回值,其他都打印0。

我尝试在 *avg 和 *presence 的指针上打印存储的值,但程序在崩溃之前获取等级值和存在值。

#include <stdio.h>

char situation(float n1,float n2,float n3,int misses, int classes, float 
*avg, float *presence);

int main()
{
    float *avg,*presence,vet[3];
    int f,a,x;
    printf("Write the value of your notes \n");
    for(x=0;x<=2;x++)
    {
        printf("Note %d:",x+1);

        scanf("%f",&vet[x]);
    }
    printf("Misses: ");
    scanf("%d",&f);
    printf("Given: ");
    scanf("%d",&a);
    char outcome=situation(vet[0],vet[1],vet[2],f,a,&avg,&presence);
    printf("With an average of %f and presence of %f percent, your situation is %c",avg,presence,outcome);
    return 0;
    }

char situation(float n1,float n2,float n3,int misses, int classes, float 
*avg, float *presence)
{
char result;
*presence=((classes-misses)/classes)*100;
*avg=(n1+n2+n3)/3;
if(*presence>=0 && *presence<75)
{
    result='F';
}
if(*presence>=75 && *presence <=100)
{
    if(*avg>=0 && *avg<6);
    {
        result='R';
    }
    if(*avg>=6 && *avg<=10)
    {
        result='A';
    }
    if(*avg<0 || *avg>10)
    {
        result='x';
    }
}
if(*presence<0 || *presence>100)
{
    result='x';
}
return result;
}

我希望屏幕上的存在、平均值和结果打印给用户,但它只给出 char 结果值

【问题讨论】:

  • ⟼如果您采用indentation style 并始终如一地应用它,此代码将受益匪浅。缩进传达了结构和意图,使我们更容易理解您的代码,而无需花费大量时间来破译它。
  • 您的编译器不会为char outcome=situation(vet[0],vet[1],vet[2],f,a,&amp;avg,&amp;presence); 调用发出警告吗?
  • 是的。我正在使用 dev c++,他从不兼容的指针类型中给出了“情况”的 pass6
  • 我是一个新程序员,我真的不知道如何解决它
  • 如果修复它删除 avg 上的指针和 main 开头的存在,并且只将它们放在函数调用中。

标签: c pointers printf


【解决方案1】:

编译器警告直接指出了问题所在。您应该检查警告并了解它的含义以及发出它的原因。

你的错误在这里:

float *avg,*presence

这些应该声明为float,而不是float *

【讨论】:

    【解决方案2】:

    avg 是一个浮点指针,您通过指针 (&avg) 发送它,因此您的函数需要是 (int n1,....,float **avg,...)

    尝试发送不带 & 的 avg。 之前给他一个值(这样更好)

    【讨论】:

      【解决方案3】:

      您的代码有一个主要问题:

      float *avg,*presence,
      

      当你打电话时

      char outcome=situation(vet[0],vet[1],vet[2],f,a,&avg,&presence);
      

      您将地址传递给刚刚声明的指针。通过更改函数outcome 中的值,您更改的是avgpresence 指向的地址,而不是变量的值。

      尝试更改为

      float avg,presence
      

      这样,当您更改值时(使用* 运算符),您将更改实际变量值。

      您可能会发现 presence 在 printf 上仍然显示为 0。这是因为 C 如何处理算术运算中的类型。您的部门只有ints,因此结果将是int。鉴于结果将始终为&gt;= 1,结果将四舍五入为 int 值,即 0。

      要解决这个问题,只需在除法中放置一个浮点值,结果将是 float. 比如:

      *presence=((classes-misses)/(classes*1.0))*100;
      

      【讨论】:

        猜你喜欢
        • 2016-06-10
        • 2021-07-28
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 2021-02-14
        相关资源
        最近更新 更多