二维数组操作

时间:2016-06-14 23:16:45

标签: c arrays

我正在尝试创建一个(10x10)2维字符数组来存储''和'T',然后像这样显示

+-+-+-+-+-+-+-+-+-+-+
| |T| |T| |T| |T| |T|
+-+-+-+-+-+-+-+-+-+-+
|T| |T| |T| |T| |T| |
+-+-+-+-+-+-+-+-+-+-+
| |T| |T| |T| |T| |T|
+-+-+-+-+-+-+-+-+-+-+
|T| |T| |T| |T| |T| |
+-+-+-+-+-+-+-+-+-+-+
| |T| |T| |T| |T| |T|
+-+-+-+-+-+-+-+-+-+-+
|T| |T| |T| |T| |T| |
+-+-+-+-+-+-+-+-+-+-+
| |T| |T| |T| |T| |T|
+-+-+-+-+-+-+-+-+-+-+
|T| |T| |T| |T| |T| |
+-+-+-+-+-+-+-+-+-+-+
| |T| |T| |T| |T| |T|
+-+-+-+-+-+-+-+-+-+-+
|T| |T| |T| |T| |T| |
+-+-+-+-+-+-+-+-+-+-+

我写的功能:

  int plant_forest(char forest[][SIZE])
{
    int i,j;
    forest[0][0] = ' ';
    for(i = 0;i<SIZE;i++)
    {
        for(j=0;j<SIZE;j++)
        {
            if(forest[i][j]!= forest[0][0])
            {
                if(forest[i][j-1]!='T' && forest[i-1][j]!= 'T')
                {
                    forest[i][j] = 'T';
                }
                else
                {
                    forest[i][j] = ' ';
                }

            }
        }
    }
    return 0;
}

我得到的结果略有不同。

+-+-+-+-+-+-+-+-+-+-+
| |T| |T| |T| |T| |T|
+-+-+-+-+-+-+-+-+-+-+
| | |T| |T| |T| |T| |
+-+-+-+-+-+-+-+-+-+-+
|T| | |T| |T| |T| |T|
+-+-+-+-+-+-+-+-+-+-+
| |T| | |T| |T| |T| |
+-+-+-+-+-+-+-+-+-+-+
|T| |T| | |T| |T| |T|
+-+-+-+-+-+-+-+-+-+-+
| |T| |T| | |T| |T| |
+-+-+-+-+-+-+-+-+-+-+
|T| |T| |T| | |T| |T|
+-+-+-+-+-+-+-+-+-+-+
| |T| |T| |T| | |T| |
+-+-+-+-+-+-+-+-+-+-+
|T| |T| |T| |T| | |T|
+-+-+-+-+-+-+-+-+-+-+
| |T| |T| |T| |T| | |
+-+-+-+-+-+-+-+-+-+-+

我检查了逻辑并找不到任何错误。除了i-1和j-1之外可能是负数。但这会如何影响执行呢?

仅供参考,我将在此处包含打印功能。但我已经检查并确定此功能没有错误

void printBoard(char forest[][SIZE])
{
    int i,j;

        printf("+-+-+-+-+-+-+-+-+-+-+\n");
        for(i = 0; i<SIZE;i++)
        {
            for(j = 0;j<SIZE;j++)
            {
                printf("|%c",forest[i][j]);
            }
            printf("|\n");
            printf("+-+-+-+-+-+-+-+-+-+-+\n");

        }

}

2 个答案:

答案 0 :(得分:1)

我认为这可能与数组中数据的存储方式有关。在内存中,数据只是存储sequentially。由于negative array indexes are allowed in C您的案例中的功能结果是森林[1] [ - 1]指向位于单元格林[0] [9]中的相同数据,您将注意到它是'T'。

因为森林[0] [9](又名森林[1] [ - 1])是'T',你没有通过这个测试

if(forest[i][j-1]!='T' && forest[i-1][j]!= 'T')

这意味着''在单元格林[1] [0]中注册。防止负指数值,你应该是好的。

答案 1 :(得分:0)

您可能会过度考虑用于填充forestplant_forest数组的逻辑。您需要错开用于填充'T'的{​​{1}}和' '元素,检查您的外循环索引forest奇数还是并根据结果开始填写'i''T'。然后,对于每个' '索引,只需在'T'' '之间切换。例如:

'j'

您可以使用一小段代码测试结果:

int plant_forest (char (*forest)[SIZE])
{
    if (!forest) return 1;              /* validate pointer */
    int i, j;

    for (i = 0; i < SIZE; i++) {
        int t = i & 1;
        for (j = 0; j < SIZE; j++)   /* simple toggle 'T' or ' ' */
            forest[i][j] = t ? 'T' : ' ', t ^= 1;
    }
    return 0;
}

示例使用/输出

#include <stdio.h>

#define SIZE 10

int plant_forest (char (*forest)[SIZE])
{
    if (!forest) return 1;              /* validate pointer */
    int i, j;

    for (i = 0; i < SIZE; i++) {
        int t = i & 1;
        for (j = 0; j < SIZE; j++)   /* simple toggle 'T' or ' ' */
            forest[i][j] = t ? 'T' : ' ', t ^= 1;
    }
    return 0;
}

int main (void) {

    char arr[SIZE][SIZE] = {{0}};

    if (!plant_forest (arr)) {
        int i, j;
        for (i = 0; i < SIZE; i++) {
            for (j = 0; j < SIZE; j++)
                putchar (arr[i][j]);
            putchar ('\n');
        }
    }
    return 0;
}

如果您有任何疑问,或者我误解了您的问题,请告诉我。 (我会留给您填写您喜欢的所有其他$ ./bin/plant T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T 格式。

您甚至可以在'|'ij之和保存一行代码,以便在分配plant_forest或{之间进行选择{1}}例如

'T'

无论哪种方式都可以确保您的' '数组正确填充。