如何从char函数返回字符串

时间:2009-12-04 15:27:38

标签: c function char variable-assignment

我希望函数getCategory()返回“invalid”,而不是在函数输入无效时打印单词“invalid”(即代替使用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 个答案:

答案 0 :(得分:2)

注意: 原始问题已被多次更改,代码也经常更改,在每次迭代中引入新错误。我留下这个答案,因为它回答了原始代码,见历史。在这个答案下面有一个更新提供建议而不是代码,因为这似乎更合适。

嗯,旁观者取消了他的回答。但也许这就是你应该拥有的:*

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”的字符串(其本身仍然返回一个特殊值)。

你不能这样做

简而言之:你做不到。当前函数的返回类型为char。我不知道你的功能的目的,但我确定你已经考虑过了,并且有理由使用char。 char只能包含一个字符。而“无效”这个词是多个字符。您有几个选择,选择最适合您的选择:

其他方式

  • 将返回类型更改为string而不是char,这需要重新设计所涉及的所有代码;
  • 以返回特殊值结算。您没有显示函数的正文,但如果它通常永远不会返回\0,则可以使用该值,如上例所示。当然,您可以选择任何其他char值;
  • 引发异常并在正文中使用try / catch。但是你使用C而不是C ++。这是一个describes using C++-style exception handling for C的链接,但这可能有点超出界限,学习C可以更好地采取一小步。

什么是最佳做法

在正常情况下,通常选择特殊情况值(典型的是旧的或更基本的语言,如C或汇编程序)或异常(典型的更多结构化语言,如C ++,Java,Python)。为特殊情况(如无效输入)更改完整功能通常被认为是不好的做法。

为什么

相反,函数的调用者应该处理这些特殊情况。其原因在于编程中一个非常重要的规则:函数永远不会事先知道该函数的用户在发生错误(非法输入)时想要做什么。可以选择打印“非法输入”(对于命令行用户),另一个想要退出程序(在库中)而另一个想要忽略并且什么都不做(用于自动处理)。简而言之:你想要实现的目标,你应该尝试以不同的方式实现(参见上面的选项2和3,以及我原来的解决方案)。

教师和教科书

对于任何(未来)同事来说,使用这种方法是最简单的,也是最好的理解,因为它遵循常见的计算机实践。当然,我还没有看到你的任务或教科书,所以我不知道他们想要一个解决方案的方向,它不会是第一个向你展示错误路径的教科书或老师,让你颤抖,然后告诉你正确的道路。

答案 1 :(得分:1)

getCategory方法并不总是返回(因为if语句)。另外,不确定if语句中的高度。在方法结束时添加另一个返回无效。

char getCategory(float height,float weight)
{
    char invalid;
    if(height<=0 || weight<=0)
       return invalid;
    return 0
}

答案 2 :(得分:0)

你需要(非常仔细地)查阅你的教科书,以确定上述代码中的大量错误 1,你在getCategory中的测试几乎肯定不会做你想做的事 2,你在某些情况下返回无效(但不是全部,见#1)。但是,没有办法知道无效没有已知值 3.在其他情况下,getCategory根本不返回任何值

答案 3 :(得分:0)

您正在定义名为invalid的变量。其内容未定义(可能是-128到127之间的任何内容)。当你返回这个变量时,你会返回任何东西;你想在返回之前给invalid变量赋值吗? e.g。


char invalid;
invalid = 'i';
if ( ... ) {
  return invalid;
} else {
  return 0;
}

答案 4 :(得分:0)

应该将无效映射到什么?你应该有这样的约定:

char invalid_category = '?';

或者也许:

#define INVALID_CATEGORY '?'

这在getCategory函数之外更好地定义,以便调用代码可以访问它。

当有效参数传递给它时,你的代码返回的内容也不明显。

答案 5 :(得分:0)

顺便说一句,在您的函数 getCategory 中,您有一个未使用也未声明的变量 - starvation。它来自哪里?我怀疑这是一个全局变量。

此外,变量bmirange没有意义也不会编译

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

正如您所看到的那样,左手边表达式(LHS),但您在表达式(RHS)的右侧使用了数组下标运算符。这是一个非法的声明!

你的意图是什么?那意味着是一对括号吗?

你能证实吗?

许多答案令人困惑,因为OP没有明确指出错误是什么,也没有解释正在发生什么导致其他人最终发布不满足OP的代码。< / p>

希望这有帮助, 最好的祝福, 汤姆。