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

标签 c arrays function 2d

用户将输入行和步的值。 R 的变量, Rowstep必须使用函数进行操作,然后打印在 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 中的函数时,在函数内部您正在使用变量的副本。当函数退出时,该副本将被销毁,因此您需要返回感兴趣的值,或者使用指针将它们存储在内存中。

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

还有很多问题需要您解决。例如,您的程序应如何处理格式错误的输入?如果用户试图离开 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[] 数组中。如果传递给函数的所有内容都是副本,程序的其余部分如何查看数组?嗯,数组很特殊,我们说它们在传递给函数时“衰减”为指针。所以你实际上在这里使用指针,只是你不知道而已。这是为了有效地使用 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,因此您也可以将其删除(除非您计划稍后使用它)。

关于c - 将多种类型的值传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40090653/

相关文章:

c - 如何将 int 数组和 char 数组写入文件

c - 我正在尝试在 Ubuntu 12.04.1 中进行系统调用。我在编译 hello.c 文件时遇到错误

php - 如何在laravel(mysql)中将obj保存在db中

ios - 数组数据在 swift 4 的 TableView 中重复

javascript - javascript 函数声明的区别

function - 如何从类型签名实现功能?

c - Oracle 上的空(字符串)元素的 XML 验证失败

javascript - 循环遍历整个数组,同时排除某个项目

javascript - 简单的javascript递归函数返回的值比实际存在的值多?

c - 是 GDB 错误还是英特尔编译器错误还是我的代码?