我正在尝试创建一个(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");
}
}
答案 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)
您可能会过度考虑用于填充forest
中plant_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
格式。
您甚至可以在'|'
中i
和j
之和保存一行代码,以便在分配plant_forest
或{之间进行选择{1}}例如
'T'
无论哪种方式都可以确保您的' '
数组正确填充。