将多种类型的值传递给函数

Passing multiple types of values to functions

用户将输入行和步骤的值。 RRowstep 的变量必须使用函数进行操作,然后在 int main.

中打印
#include <stdio.h>
#include <stdlib.h>

void Direction(char z) {
  printf("Walking to the right\n");
  z = getchar();
}

void RowAndSteps(char z, int c, int f) {
  if (z == 'R') {
    printf("Row\n");
    scanf("%d", &c);

    printf("Steps");
    scanf("%d", &f);
  }
}

void print(char a[4][4]) {
  int i, k;
  for (i = 0; i < 4; i++) {
    for (k = 0; k < 4; k++) {
      printf("%c ", a[i][k]);
    }
    printf("\n");
  }
}

int main() {
  char a[4][4] = {
      { '*', '*', '*', '*' },
      { '*', '*', '*', '*' },
      { '*', '*', '*', '*' },
      { '*', '*', '*', '*' } };

  Direction(z);
  RowAndSteps(z, c, f);
  a[c][f] = 'O';

  print(a);
  return 0;
}

你真的需要一本好书,这样你才能学习 C 编程语言。特别是,上面代码中的问题似乎源于对变量范围以及变量如何传入和传出函数的误解。当您将变量传递给 C 中的函数时,您在函数内部使用该变量的副本。该副本在函数退出时被销毁,因此您需要 return 感兴趣的值,或使用指针将它们存储在内存中。

我已经修复了你的代码,做了最少的必要工作 运行。我稍微更改了格式以使其更具可读性,并将您的 RowAndSteps() 函数分解为两个函数(因为 C 只允许一个函数 return 一个值)。我在必要时添加了声明。新函数只传递它们需要的信息,并且它们每个 return 一个值。你的 print() 函数很好——你正确地给了它一个数组,它不需要 return 一个值。

还有很多问题等着你去解决。例如,您的程序应该如何处理格式错误的输入?如果用户试图离开 4X4 网格怎么办?

修改后的代码如下:

#include <stdio.h>
#include <stdlib.h>

char direction(void)
{
  printf("Walking to the right\n");

  return getchar();
}

int getRow(char z)
{
    int c;

    if (z == 'R') {
        printf("Row: ");
        scanf("%d", &c);
    }

    return c;
}

int getSteps(char z)
{
    int f;

    if (z == 'R') {
        printf("Steps: ");
        scanf("%d", &f);
    }

    return f;
}

void print(char a[4][4])
{
    int i, k;

    for (i = 0; i < 4; i++) {
        for (k = 0; k < 4; k++) {
            printf("%c ", a[i][k]);
        }
        printf("\n");
    }
}

int main(void)
{
    char z;
    int c, f;  
    char a[4][4] = {
        { '*', '*', '*', '*' },
        { '*', '*', '*', '*' },
        { '*', '*', '*', '*' },
        { '*', '*', '*', '*' }
    };

    z = direction();
    c = getRow(z);
    f = getSteps(z);

    a[c][f] = 'O';

    print(a);

    return 0;
}

如果您绝对必须使用一个函数来获取 cf,您可以在 main 中声明一个 input[] 数组,并将其传递给您的函数以保存值.这是它的工作原理。

将此函数定义添加到上面的代码中 main():

void getRowsAndSteps(int input[2], int z)
{
    if (z == 'R') {
        printf("Row: ");
        scanf("%d", &input[0]);
        printf("Steps: ");
        scanf("%d", &input[1]);
    }
}

此函数提示用户输入两个整数,并将值存储在input[] 数组中。如果传递给函数的所有内容都是副本,程序的其余部分如何才能看到数组?好吧,数组很特殊,我们说它们在传递给函数时 "decay" 指向指针。所以你真的在这里使用一个指针,你只是不知道。这是您需要了解的细节之一,以便有效地使用 C。

将此声明添加到 main() 中的其他声明中,将 input[] 数组初始化为零:

int input[2] = {0};

然后更改 main() 的主体,将值赋给 input[] 数组中的 cf

    z = direction();
//    c = getRow(z);
//    f = getSteps(z);
    getRowsAndSteps(input, z);
    c = input[0];
    f = input[1];

如果您正在使用它,则不再需要 getRow()getSteps() 的定义,因此您可以根据需要删除它们(以及对它们的注释掉的调用)。此外,此处没有任何内容需要 stdlib.h,因此您也可以删除它(除非您打算稍后使用它)。