Как вернуть строку из функции char - PullRequest
0 голосов
/ 04 декабря 2009

Я хочу, чтобы функция getCategory () возвращала «недопустимый», вместо того, чтобы печатать слово «недействительный» (т.е. вместо использования printf), когда ввод в функцию недопустим (т. Е. Когда рост или вес меньше нуля) , пожалуйста, помогите:

#include<stdio.h>
#include<conio.h>

char getCategory(float height,float weight)
{
    char invalid = '\0'; 
    float bmirange;

    if(height<=0 || weight<=0)
        return invalid;
    else
    {
        height=height*0.01;        //1 centimeter = 0.01 meters
        bmirange=[weight/(height*height)];

        if(bmirange< 15 )
            return starvation;
    } 
}

int main()
{
    char Category;
    float height,weight;

    printf("enter height");
    scanf("%f",&height);

    printf("enter weight");
    scanf("%f",&weight);

    Category=getCategory(height,weight);

    if(Category == 0)
        printf("invalid");
    else
        printf("%c", Category);
 }

Ответы [ 6 ]

2 голосов
/ 04 декабря 2009

ПРИМЕЧАНИЕ: исходный вопрос изменялся много, много раз, и код менялся так же часто, внося новые ошибки в каждую итерацию. Я оставляю этот ответ, так как он ответил на оригинальный код, смотрите историю. Ниже этого ответа есть обновление, дающее советы вместо кода, так как здесь это более уместно.

Хм, Астандер убрал свой ответ. Но, возможно, это то, что вы должны иметь: *

char getCategory(float height,float weight)
{
    char invalid = '\0';

    if(height<=0 || weight<=0)
        return invalid;

    return 'c';   /* do something for the valid cases */
}

* Первоначально вопрос содержал height || weight <= 0 и не имел значения для переменной invalid.

Примечания к коду:
При правильном отступе поток вашей программы становится понятнее. Я исправил ваше if-утверждение, предполагая, что это действительно было вашим намерением. Последняя строка должна содержать то, что вы в данный момент не указали в своем вопросе. Я добавил инициализацию в первой строке, потому что иметь значение лучше, чем не иметь значение (что означает: если вы не инициализируете, это может быть что угодно, на самом деле).

В своем телефонном коде вы можете сделать это:

Category = getCategory(height, weight);
if(Category == 0)
    printf("invalid");
else
    printf("%c", Category);

, который фактически выводит слово "invalid" на вывод, если это было ваше намерение.


Обновление: на основе нового текста в вопросе, ясно, что спрашивающий хочет что-то еще, так что вот новый ответ. Я оставляю вышеупомянутое, это все еще действует с оригинальным вопросом.

Теперь вы просите , а не напечатать слово "invalid", а not , чтобы использовать специальное значение для неверного регистра. Вместо этого вы просите вернуть "invalid", что, как я понимаю, возвращает строку со значением «invalid» (которая сама по себе возвращает специальное значение).

Вы не можете сделать это

Короче говоря: вы не можете этого сделать. Текущая функция имеет тип возврата char. Я не знаю цели вашей функции, но я уверен, что вы обдумали это, и есть причина для использования char. Символ может содержать только один символ. И слово «недействительный» состоит из нескольких символов. У вас есть несколько вариантов, выберите тот, который вам больше подходит:

Другие способы

  • изменить тип возвращаемого значения на string вместо char, для этого требуется перепроектирование всего задействованного кода;
  • согласиться с возвратом специального значения. Вы не показываете тело своей функции, но если она обычно не возвращает \0, вы можете использовать это значение, как в моем примере выше. Конечно, вы можете выбрать любой другой символ;
  • вызвать исключение и использовать попытку / поймать в теле. Но вы используете C, а не C ++. Вот ссылка, которая описывает использование обработки исключений в стиле C ++ для C , но это может быть немного за пределами, изучение C может быть лучше предпринято на небольшом шаге в то время.

Что обычно является лучшей практикой

В обычных ситуациях обычно выбирают либо значения специального случая (типичные для более старых или более базовых языков, таких как C или ассемблер), либо исключения (типичные для более структурированных языков, таких как C ++, Java, Python). Обычно считается плохой практикой изменять целую функцию для особых случаев (например, неверный ввод).

Почему

Вместо этого вызывающая функция должна иметь дело с этими особыми случаями. Причиной этого является очень важное правило в программировании: функция никогда не может заранее знать, что пользователи этой функции хотят делать, когда происходит что-то плохое (недопустимый ввод). Один может распечатать «Неверный ввод» (для пользователей командной строки), другой хочет выйти из программы (для в библиотеке), а другой хочет игнорировать и ничего не делать (для автоматической обработки). Короче говоря: то, что вы пытаетесь достичь, вы должны попытаться достичь по-другому (см. Выше вариант 2 и 3, и мое первоначальное решение).

Учителя и учебники

Использование этого подхода является наиболее простым и понятным для любого (будущего) сотрудника, поскольку оно следует общепринятым компьютерным практикам. Конечно, я не видел ваше задание или учебник, поэтому я не могу сказать, в каком направлении они хотят найти решение, и это будет не первый учебник или учитель, который первым укажет вам неправильный путь, пусть дрожит и затем покажу вам правильный путь.

1 голос
/ 04 декабря 2009

Метод getCategory не всегда возвращает (из-за оператора if). Кроме того, не уверен насчет высоты в операторе if. Добавьте еще одно возвращаемое значение в конце метода.

char getCategory(float height,float weight)
{
    char invalid;
    if(height<=0 || weight<=0)
       return invalid;
    return 0
}
0 голосов
/ 05 декабря 2009

Кстати, в вашей функции getCategory у вас есть переменная, которая не используется и не объявляется - starvation. Откуда это? Я сомневаюсь, что это глобальная переменная.

Кроме того, переменная bmirange не имеет смысла и не будет компилироваться

bmirange=[weight/(height*height)];

Как вы можете видеть, это левое выражение (LHS), но вы использовали операторы индексов массива в правой части выражения (RHS). Это незаконное заявление!

Каково было ваше намерение там? Это должно было быть парой скобок?

Вы можете это подтвердить?

Многие ответы вводят в заблуждение, потому что ФП не дал понять, в чем заключается ошибка, и не объяснил, что происходит, что приводит к тому, что другие заканчивают тем, что публикует код, который не соответствует ФП. 1016 *

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 04 декабря 2009

На что должен быть сопоставлен неверный? Вы должны иметь соглашение, подобное этому:

char invalid_category = '?';

или, возможно:

#define INVALID_CATEGORY '?'

Это лучше определено вне функции getCategory, чтобы вызывающий код мог получить к ней доступ.

Также не очевидно, что ваш код возвращает, когда ему передаются действительные аргументы.

0 голосов
/ 04 декабря 2009

Вы определяете переменную с именем invalid. Его содержимое не определено (это может быть что-то от -128 до 127). Когда вы возвращаете эту переменную, вы возвращаете что угодно; Вы хотите присвоить что-то переменной invalid, прежде чем ее вернуть? например,


char invalid;
invalid = 'i';
if ( ... ) {
  return invalid;
} else {
  return 0;
}
0 голосов
/ 04 декабря 2009

вам нужно (очень осторожно) разглядеть учебник, чтобы определить множество ошибок в приведенном выше коде.
1, ваш тест в getCategory почти наверняка не будет делать то, что вы хотите.
2, вы возвращаете недействительным в некоторых случаях (но не во всех, см. # 1). Тем не менее, нет никакого способа узнать, что как недействительный не имеет известного значения.
3. в других случаях getCategory вообще не возвращает значения

...