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

时间:2016-10-17 15:48:03

标签: c arrays function 2d

用户将输入行和步的值。 git rebaseRRow的变量必须使用step中打印的函数进行操作。

int main

1 个答案:

答案 0 :(得分: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[]数组中。如果传递给函数的所有内容都是副本,程序的其余部分如何看到数组?嗯,阵列是特殊的,我们说它们会腐烂#34;传递给函数时的指针。所以你真的在这里使用指针,你只是不知道它。这是您需要了解的有效使用C的详细信息之一。

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

int input[2] = {0};

然后更改main()的正文,将值从c数组分配给finput[]

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

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