【问题标题】:Return a string from if statement in C从 C 中的 if 语句返回一个字符串
【发布时间】:2019-04-25 15:38:24
【问题描述】:

我试图让函数通过 if 语句从数组中返回正确的 char 值,但不断收到以下错误
returning ‘char *’ from a function with return type ‘char’ makes integer from pointer without a cast

这里是函数

    ...
    char GradeFromPercentage(float x)
    { 
        char y[5][1];
        y[1] == "A";
        y[2] == "B";
        y[3] == "C";
        y[4] == "D";
        y[4] == "F";

        if (x >= 90)
        {
            return y[0];
        }
        else if (x >= 70)
        {
            return y[1];
        }
            else if (x >= 50)
        {
            return y[3];
        }
        else if (x >= 30)
        {
            return y[4];
        }
        else if (x < 30)
        {
            return y[5];
        }
        return 0;
    }
    ...

【问题讨论】:

    标签: c function if-statement char


    【解决方案1】:

    哇,这里到处都是错误!!

    如果要存储单个字符的数组,只需将其定义为:

    char y[5];
    

    现在,接下来有几个问题:

    y[1] == "A";
    y[2] == "B";
    y[3] == "C";
    y[4] == "D";
    y[4] == "F";
    

    除了使用比较运算符 (==) 而不是赋值 (=) 之外,您还尝试将字符串文字分配给 char 数组。您不能在变量定义之外执行此操作。但我断言你不想使用字符串。您还错过了y[0],并在y[4] 上加倍。

    由于我已经更改了您的数组定义,我们需要字符文字(单引号)。让我们修复所有

    y[0] == 'A';
    y[1] == 'B';
    y[2] == 'C';
    y[3] == 'D';
    y[4] == 'F';
    

    但是打字太多了...为什么不在一行中定义它,既节省您的手指又使您的代码更紧凑(实际上更具可读性):

    char y[5] = { 'A', 'B', 'C', 'D', 'F' };
    

    下一个问题是您要返回 y[5] 以获得“F”分数,这是不正确的 - 这是在您的数组外部访问:记住索引是从零开始的,因此有效索引的范围是 0 到 4(含) .您需要检查所有索引,因为其中一些是错误的。


    我的最后一点是基于风格的东西,你可以接受也可以放弃。与其拥有这么大的 if 语句,不如将所有的截止分数放入一个数组中……将它融入我到目前为止提到的所有其他东西中,你最终会得到这样的结果:

    char GradeFromPercentage(float score)
    {
        const char grades[5] = { 'A', 'B', 'C', 'D', 'F' };
        const float scores[5] = { 90.f, 70.f, 50.f, 30.f, -FLT_MAX };
        for (int i = 0; i < 5; i++)
        {
            if (score >= scores[i]) return grades[i];
        }
    
        // It should not ordinarily be possible to reach here, but you should
        // return something anyway.  It's possible to get here if you supply
        // a score of `NaN`.  You may choose to return an invalid grade, or
        // 'F' or whatever.
        return '\0';
    }
    

    【讨论】:

      【解决方案2】:

      如果您仍然收到错误,则问题在于函数返回类型。

      首先声明函数返回类型为 char 并返回 char*。

      所以你必须替换 char * 而不是 char 作为函数返回类型。

      如果您不知道数组是否与指针相同,请转到下面的链接并阅读。

      http://www.cplusplus.com/doc/tutorial/pointers/

      【讨论】:

        【解决方案3】:

        将您的“==”编辑为“=” 像这样

            y[1] = "A";
            y[2] = "B";
            y[3] = "C";
            y[4] = "D";
            y[5] = "F";
        

        而你只想返回 A,B,C,D,F 你可以使用一维数组 像这样

        char y[5] ={'A','B','C','D','F'};
        

        最简单的方法是

        返回'A';返回'B'; ...

        【讨论】:

          【解决方案4】:

          您只是从二维数组中获取数组!你必须这样做:

          if (...) {
              return y[0][1];
          } else if (...) {
              return y[1][1];
          }
          
          ...
          

          您的y 数组是一个二维数组。二维数组是保存数组的数组。 y[5][1] 将定义一个长度为 5 的字符数组,数组中的每个单元格都包含另一个长度为 1 的字符数组。

          由于您仅在第一级引用y 中的元素(例如y[0]),您将获得字符数组而不仅仅是一个字符。要获取y 中的字符,您需要引用两次:一次获取包含字符的数组,另一次获取数组中的字符。

          或者,您可以只使用可以定义的一维数组

          char y[5];
          y[0] = 'A';
          ...
          

          或者,作为 achicn3 suggested,与

          char y[5] = {'A', ..., 'F'};
          

          【讨论】:

            【解决方案5】:

            您收到错误消息是因为您尝试从函数返回 y[N]。当y被定义为

            char y[5][1];  // array of 5 arrays of 1 chars
            

            那么y[N] 是一个包含 1 个字符的数组,它将衰减为指向 char 的指针。

            此外,您使用了比较运算符 ==,您显然打算在其中赋值 =

            【讨论】:

              猜你喜欢
              • 2015-02-05
              • 2015-01-15
              • 1970-01-01
              • 2021-02-26
              • 1970-01-01
              • 2013-04-05
              • 1970-01-01
              • 2018-06-27
              • 1970-01-01
              相关资源
              最近更新 更多