从函数返回多个值

时间:2010-09-30 09:01:38

标签: c

有谁能告诉我如何从函数中返回多个值?
请详细说明一下?

8 个答案:

答案 0 :(得分:20)

你在这里的选择是返回一个包含你喜欢的元素的结构,或者让函数用指针处理参数。

/* method 1 */
struct Bar{
    int x;
    int y;
};

struct Bar funct();
struct Bar funct(){
    struct Bar result;
    result.x = 1;
    result.y = 2;
    return result;
}

/* method 2 */
void funct2(int *x, int *y);
void funct2(int *x, int *y){
    /* dereferencing and setting */
    *x  = 1;
    *y  = 2;
}

int main(int argc, char* argv[]) {
    struct Bar dunno = funct();
    int x,y;
    funct2(&x, &y);

    // dunno.x == x
    // dunno.y == y
    return 0;
}

答案 1 :(得分:18)

你不能直接这样做。您可以选择将多个值包装到结构中,或者将它们作为指针参数传递给函数。

e.g。

typedef struct blah
{
    int a;
    float b;
} blah_t;


blah_t my_func()
{
    blah_t blah;
    blah.a = 1;
    blah.b = 2.0f;
    return blah;
}

或:

void my_func(int *p_a, float *p_b)
{
    *p_a = 1;
    *p_b = 2.0f;
}

答案 2 :(得分:7)

首先,退后一步,询问为什么需要返回多个值。如果这些值彼此不相关(无论是在功能上还是在操作上),那么您需要停下来并重新思考您正在做的事情。

如果各种数据项是较大的复合数据类型(例如邮寄地址,销售订单中的行项目或多个属性描述的某种其他类型)的一部分,则定义要表示的结构类型该复合类型的单值

struct addr { // struct type to represent mailing address
  char *name;
  int streetNumber;
  char *streetName;
  char *unitNumber; 
  char *city;
  char state[3];
  int ZIP;
};

struct addr getAddressFor(char *name) {...}

struct point2D {
  int x;
  int y;
};

struct polygon2D {
  size_t numPoints;
  struct point2D *points;
};

struct point2D getOrigin(struct polygon2D poly) {...}

定义一个结构来收集彼此不相关的随机项;这只会给你和任何必须维护你的代码的人造成混乱。

如果数据项不是功能相关的,但在某种程度上操作相关(例如数据加上状态标志加上有关操作或项目的元数据作为单个输入操作的一部分),则使用多个可写参数。最明显的例子是标准库中的*scanf()函数。还有strtod()strtol()函数,它们转换数字的字符串表示形式;它们返回转换后的值,但它们也会写入未转换为单独参数的第一个字符:

char *str = "3.14159";
double value;
char *chk;

value = strtod(str, &chk);
if (!isspace(*chk) && *chk != 0)
  printf("Non-numeric character found in %s\n", str);

你可以结合这些方法;这是一个受我正在做的一些工作启发的例子:

typedef enum {SUCCESS, REQ_GARBLED, NO_DATA_OF_TYPE, EMPTY, ERROR} Status;

typedef struct bounds {...} Bounds; 

tyepdef struct metadata {
  size_t bytesRead;
  size_t elementsRead;
  size_t rows;
  size_t cols;
} Metadata;

typedef struct elevations {
  size_t numValues;
  short *elevations;
} Elevations;

Elevations elevs;
Metadata meta;
Bounds b = ...; // set up search boundary

Status stat = getElevationsFor(b, &elevs, &meta);

我请求高程数据的服务返回一维值序列;数组的维度作为元数据的一部分返回。

答案 3 :(得分:5)

您可以使用结构:

#include <stdio.h>

struct dont { int x; double y; };

struct dont fred(void)
{
        struct dont b;
        b.x = 1;
        b.y = 91.99919;
        return b;
}

int main(int argc, char **argv)
{
        struct dont look = fred();
        printf("look.x = %d, look.y = %lf\n", look.x, look.y);
        return 0;
}

答案 4 :(得分:3)

您无法从C函数返回多个值。 你可以

  1. 返回具有多个值的数据结构,如结构或数组。
  2. 传递指向函数的指针并修改函数内部指针的值。您需要传递x个指针,其中x是您需要的返回值的数量

答案 5 :(得分:1)

要从函数返回多个值,我们应该使用指针。这是一个你可以更好地理解它的例子

int* twoSum(int* nums, int numsSize, int target) {

int i,j,*a;
a=(int*)malloc(2*sizeof(int));
for(i=0;i<numsSize;i++)
for(j=i+1;j<numsSize;j++)
if(nums[i]+nums[j]==target)
 {
     a[0]=i;
     a[1]=j;
 return a;
 }

}

答案 6 :(得分:0)

我是C的初学者,所以我没有数组,指针,结构的经验。为了从我的函数中获取多个值,我只使用了一个全局变量。

这是我的代码:

#include <stdio.h>

double calculateCharges( double hourCharges );

// Global variable for totalCharges-function and main-function interaction
double totalCharges = 0;

int main ( void ) {

    double car1 = 0;
    double car2 = 0;
    double car3 = 0;
    double totalHours = 0;

    printf( "%s", "Hours parked for Car #1: ");
    scanf( "%lf", &car1 );

    printf( "%s", "Hours parked for Car #2: ");
    scanf( "%lf", &car2 );

    printf( "%s", "Hours parked for Car #3: ");
    scanf( "%lf", &car3 );

    totalHours = car1 + car2 + car3;

    printf( "%s", "Car\tHours\tCharge\n");

    printf( "#1\t%.1f\t%.2f\n", car1, calculateCharges( car1 ));
    printf( "#2\t%.1f\t%.2f\n", car2, calculateCharges( car2 ));
    printf( "#3\t%.1f\t%.2f\n", car3, calculateCharges( car3 ));
    printf( "TOTAL\t%.1f\t%.2f\n", totalHours, totalCharges);
}

double calculateCharges( double hourCharges ) {

    double charges = 0; 

    if( hourCharges <= 3.0 ) {
        charges = 2;
    } else if ( hourCharges >= 24.0) {
        charges = 10.00;
    } else {
        charges = ((hourCharges - 3.0)*0.5) + 2.0;
    }

    totalCharges += charges;

    return charges;

}

答案 7 :(得分:-2)

方法1使用数组

方法2使用指针

方法3使用结构