【问题标题】:Passing multiple types of values to functions [closed]将多种类型的值传递给函数[关闭]
【发布时间】:2016-10-17 15:48:02
【问题描述】:

用户将输入行和步的值。 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;
}

【问题讨论】:

  • 你的问题是什么?
  • 顺便说一句Direction(foo);不会改变foo 的值。在 C 中,参数是按值传递的。你需要指针来做你想做的事。
  • 主函数中没有zcf。查看您的编译器错误:ideone.com/ougd7K
  • 当我写 char z, int c, f;我收到一个错误“这些值未初始化。初始化它们的正确方法是什么?谢谢
  • 有没有不使用指针的方法?

标签: c arrays function 2d


【解决方案1】:

你真的需要一本好书,这样你才能了解 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。

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

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 的内容,因此您也可以将其删除(除非您计划稍后使用它)。

【讨论】:

  • 我真的很感激。
  • @FruitPunchSamurai-- 如果这有用,请考虑给我点赞和/或接受我的回答 :)
  • 这非常有用,我仍然需要为其添加更多条件,但我不知道如何将这些值从函数传递到 main。
  • C 中的函数有一个返回值(可能是void),它们最多可以返回一个值。本质上,当您将值传递给函数时,这些值是函数内部的副本。这些副本在函数退出时被销毁,因此您必须返回任何必要的信息,或者使用指针来修改存储在内存中的值。您似乎试图修改函数内部的变量,所以这就是为什么评论者说您需要指针。
猜你喜欢
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多