【问题标题】:How to return multiple value with different data type from a single function in c如何从c中的单个函数返回具有不同数据类型的多个值
【发布时间】:2021-09-03 17:36:38
【问题描述】:

我想从 input() 函数返回一个 char 变量和两个 int 变量到主函数,我该怎么做呢

char Input(char ctgry, int cls, int day)
{
    
    do
    {
        printf("Category (G-Government, N-Non government) : ");
        scanf("%c", &ctgry);

        if (ctgry != 'G' && ctgry != 'N')
            printf("Invalid\n");
    } while (ctgry != 'G' && ctgry != 'N');
    
    do
    {
        printf("Ward Class: ");
        scanf("%d", &cls);
        if (cls != 1 && cls != 2 && cls != 3)
            printf("Invalid\n");
    } while (cls != 1 && cls != 2 && cls != 3);
    
    printf("No. of days: ");
    scanf("%d", &day);

    return;
}

【问题讨论】:

  • 如何通过引用传递变量的地址?
  • egarding: scanf("%c", &ctgry); 这不会(在任何一次执行中)消耗尾随的换行符。结果是这个包含循环多次执行而没有可用的结果,建议:scanf(" %c", &ctgry); 注意空间,它将消耗任何“空白”

标签: c function return-value


【解决方案1】:

在 C 中,您只能返回一个值。所以没有办法返回一个char和两个整数。

但是,有一些变通方法。

您可以对结构中的变量进行分组并返回一个结构值。喜欢:

struct retVal
{
    char a;
    int b;
    int c;
}

struct retVal foo(...)
{
    struct retVal result;
    ...
    result.a = some_value;
    result.b = some_value;
    result.c = some_value;
    return result;
}

然后这样称呼它:

struct retVal values = foo(...);
printf("Values after function call %c %d %d\n", values.a, values.b, values.c); 

或者,您可以将指针传递给两个整数,然后直接在函数中更新它们。

喜欢:

char foo(int* i1, int* i2, ...)
{
    char result;
    ...
    result = some_value;
    *i1 = some_value;
    *i2 = some_value;
    return result;
}

然后这样称呼它:

int x;
int y;
char c = foo(&x, &y, ...);
printf("Values after function call %c %d %d\n", c, x, y); 

【讨论】:

  • 目前我们还没有根据我的课程使用结构,所以我只能使用函数和数组来做到这一点,但我要去看看引用调用的东西
【解决方案2】:

给定:

char Input( char* ctgry, int* cls, int* day ) ;

那么例如cls 的分配将是:

scanf( "%d", cls ) ;

即删除“地址”& 运算符,以便修改 调用者的变量。

不清楚您打算返回什么(您定义了它char 但什么都不返回),但通过char* ctgry 返回单个字符是不寻常的并且可能具有误导性 - 看起来可能会返回一个字符串。我建议:

char Input( int* cls, int* day)
{
    char category = 0 ;

    ...

    return category ;
}

你会打电话给:

int x, y ;
char cat = Input( &x, &y ) ;

顺便说一句,您的输入检查是不安全的,例如您没有检查scanf() 是否成功解释了输入。例如,如果cls 用户键入“ABC”,则不会发生转换,并且cls 的值未定义 - 无论输入有效性如何,后续测试都可能不确定地为真或假:

    int converted = scanf( "%d", cls ) ;
    if( converted == 0  && cls < 1 && cls > 3 )
        printf("Invalid\n");

您也需要对day 进行有效性检查 - 不是针对范围,而是因为用户可能输入了与 %d 不匹配的内容 - 尽管负值可能无效?

您还可以避免在 while 条件中重复有效性检查表达式,以避免测试不匹配并减少维护:

bool valid = false ;
do
{
    valid = scanf( "%d", cls ) != 0 && 
            cls > 0 && cls < 4 ;

    if( !valid ) printf( "Invalid\n" ) ;

} while( !valid ) ;

【讨论】:

    【解决方案3】:

    我们可以使用称为“按地址调用”或“按引用调用”的方法从函数返回多个值。在invoker函数中,我们将使用两个变量来存储结果,该函数将获取指针类型的数据。所以我们要传递数据的地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2019-05-04
      • 1970-01-01
      • 2015-07-21
      相关资源
      最近更新 更多