Вернуть строку из оператора if в C - PullRequest
0 голосов
/ 23 ноября 2018

Я пытался разрешить функции возвращать правильное значение символа из массива с помощью оператора if, но продолжал получать следующую ошибку
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;
    }
    ...

Ответы [ 5 ]

0 голосов
/ 23 ноября 2018

Если вы по-прежнему получаете сообщение об ошибке, проблема связана с типом возвращаемого значения функции.

В первом случае вы объявляете функцию с типом возвращаемого значения char и возвращаете char *.

Таким образом, вам нужно заменить char * вместоchar как тип возвращаемого значения функции.

Если вы не знаете, что массив такой же, как указатель, перейдите по ссылке ниже и прочитайте.

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

0 голосов
/ 23 ноября 2018

Вы получаете массив только из своего 2D-массива!Вы должны сделать что-то вроде этого:

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

...

Ваш y массив является 2D-массивом.2D-массивы - это массивы, которые содержат массивы.y[5][1] будет определять массив символов длиной 5, где каждая ячейка в массиве будет содержать другой массив символов длиной 1.

Поскольку вы ссылаетесь на элементы в y только на первом уровне (например, y[0]), вы получите массив символов вместо просто символа.Чтобы получить символы внутри y, вам нужно будет сослаться дважды: один, чтобы получить массив, содержащий символ, и другой, чтобы получить символ внутри массива.

В качестве альтернативы, вы можете просто использовать одномерный массив, которыйВы можете определить с помощью

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

или, как указано в achicn3 , с помощью

char y[5] = {'A', ..., 'F'};
0 голосов
/ 23 ноября 2018

Ого, здесь повсюду ошибки !!

Если вы хотите сохранить массив из отдельных символов, просто определите его как:

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 включительно.Вы должны проверить все свои индексы, потому что некоторые из них неверны.


Мой последний пункт будет основанным на стиле, и вы можете принять его или оставить.Вместо того, чтобы делать это большое выражение «если», почему бы не поместить все свои баллы отсечки в массив ... Свернув это во все остальное, что я упомянул до сих пор, вы бы получили что-то вроде этого:

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';
}
0 голосов
/ 23 ноября 2018

Вы получаете сообщение об ошибке, потому что вы пытаетесь вернуть y[N] из функции.Когда y определяется как

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

, тогда y[N] - это массив из 1 символа, который будет распадаться на указатель на символ.

Кроме того, вы использовали оператор сравнения == где вы четко намеревались назначить =.

0 голосов
/ 23 ноября 2018

измените ваш "==" на "=" следующим образом

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

, и вы просто хотите вернуть A, B, C, D, F, вы можете использовать 1-й массив, как этот

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

и самый простой способ -

retun 'A';вернуть 'B';...

...