首页 > 解决方案 > 如何将两个向量相加并打印结果,这也是一个向量

问题描述

我在这段代码中有 3 个函数。第一个vector_add,取两个向量xy的总和,并将它们放入另一个向量z中,这三个向量都由N=3元素组成(在顶部定义)。第二个vector_print,用于printf遍历 z 中的元素以将第i个元素打印为数组。最后,main 函数定义了我的输入。我的目标是让输出读取:z is 3 5 7,即xy的总和。但目前,它输出以下内容:

3.0000005.0000007.000000
z is 10

显然,这不是我想要的。但至少(不知何故),3、5 和 7 都在那里!

专家们,请花点时间查看我的代码并提供建议以接收我想要的输出。我想保持这个代码在相同的通用格式,即 3 个单独的函数。

#include <stdio.h>

// vector length (fixed)

#define N (3)

// ---------------------------------------------------------------------
// vector_add
//
// returns the linear sum of the two vectors and puts them in another
// x: first vector
// y: second vector
// z: solution vector

double
vector_add(double x[N], double y[N], double z[N])
{
  for (int i = 0; i < N; i++) {
    z[i] += x[i] + y[i];
  }
  return *z;
}

// ---------------------------------------------------------------------
// vector_print
//
// prints the elements of an N array

int
vector_print(double z[N])
{
  for (int i = 0; i < N; i++) {
    printf("%f", z[i]);
  }
  printf("\n");
}

// ---------------------------------------------------------------------
// main
//
// test the vector_add() function

int
main(int argc, char **argv)
{
  double x[N] = { 1., 2., 3. };
  double y[N] = { 2., 3., 4. };
  double z[N] = {0,0,0};
  vector_add(x, y, z);

  printf("z is %d", vector_print(z)); {
    printf("\n");
  }

  return 0;
}

标签: c

解决方案


在这一行:

printf("z is %d", vector_print(z));

首先要评估的参数printf(),这导致执行vector_print(z),输出3.0000005.0000007.000000

然后,从vector_print()有效返回 10

printf("z is %d", 10);

被执行,产生你观察到的输出。顺便说一句,这10是一些随机值,因为您的函数不会返回与其承诺相反的值。

如果你想让你的函数vector_print()返回一个字符串,你有几个选择。最简单的可能是返回一个指向这样的静态字符数组的指针(未经测试的代码):

char *
vector_print(double z[N])
{
  static char buf[100];
  char *ptr = buf;
  for (int i = 0; i < N; i++) {
    ptr += snprintf(ptr, sizeof(buf)-(ptr-buf), "%f ", z[i]);
  }
  return ptr;
}

然后用

printf("z is %s\n", vector_print(z));

然后它应该按您的预期工作。


推荐阅读