[英]How would I replace a value in a 2d array structure for a different value and printing function for the 2d array structure in c?
当工作人员已经挖掘了整个值“ s”的空间时,输出应该像这样打印出来,它变为值“ T”,并且如果您可以帮助创建一个用于打印地图结构的函数,而不是每次我们都使用for循环,也将不胜感激!:
Crew Dig Carry
1 3 1
2 2 5
3 4 1
4 1 3
您想将船员1送到哪里?
4s 1s 3s
1s 2s 3s
1s 5s 1s
1 3
您已经除去了本节中的所有沙子!
您想将机组人员2送到哪里?
4s 1s 1T
1s 2s 3s
1s 5s 1s
2 2
到目前为止,我有:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUMCREW 4
#define MAXHOUR 8
#define MINHOUR 1
#define ROW 3
#define COL 3
struct pirate {
int dig;
int carry;
};
struct map {
int sand;
int treasure;
};
void printcrew(struct pirate * pirate_data);
void print(struct map * map_data);
int main() {
char filename[20];
int hour=8;
int crew=0;
int i, j, x, y;
int space;
struct map map_data[ROW][COL];
struct pirate pirate_data[NUMCREW];
FILE * ifp;
printf("You have arrived at Treasure Island!\n");
printf("What is the name of your map?\n");
scanf("%s", filename);
ifp = fopen(filename, "r");
for (i=0; i<ROW; i++){
for (j=0; j<COL; j++) {
fscanf(ifp, "%d %d", &map_data[i][j].sand, &map_data[i][j].treasure);
}
}
for (i=0; i<NUMCREW; i++) {
fscanf(ifp, "%d", &pirate_data[i].dig);
fscanf(ifp, "%d", &pirate_data[i].carry);
}
fclose(ifp);
for (hour=8; hour >= MINHOUR; hour--) {
printf("\nYou have %d hours left to dig up the treasure.\n", hour);
printcrew(pirate_data);
printf("\n");
for (crew=0; crew<NUMCREW; crew++){
printf("Where would you like to send crew member %d?\n", crew+1);
for(i=0; i<ROW; i++) {
for (j=0; j<COL; j++) {
printf("%ds\t", map_data[i][j].sand);
if (map_data[i][j].sand == 0) {
printf("%dT\t", map_data[i][j].treasure);
}
}
printf("\n");
}
scanf("%d %d", &x, &y);
map_data[x-1][y-1].sand = map_data[x-1][y-1].sand - pirate_data[crew].dig;
}
}
return 0;
}
void printcrew(struct pirate * pirate_data) {
int i;`
printf("Crew \t Dig \t Carry \n");
for (i=0; i<NUMCREW; i++)
printf("%d \t %d \t %d \n", i+1, pirate_data[i].dig, pirate_data[i].carry);
return;
}
void print(struct map * map_data) {
int i, j;
for(i=0; i<ROW; i++) {
for (j=0; j<COL; j++) {
printf("%ds\t", map_data[i][j].sand);
}
printf("\n");
}
return;
}
我的输出不断像这样:
您想将船员1送到哪里?
4s 1s 3s
1s 2s 3s
1s 5s 1s
1 3
您想将机组人员2送到哪里?
4s 1s 0s 1T
1s 2s 3s
1s 5s 1s
2 2
您想将机组人员3送到哪里?
4s 1s 0s 1T
1s 0s 1T 3s
1s 5s 1s
至于打印结构图功能,我一直收到以下错误:
在“打印”功能中:|
错误:下标值既不是数组也不是指针,也不是vector |
张贴的代码中似乎有错字; 在printcrew()
函数中有一个杂散的`字符。 为此,应该看到编译器警告,并且应该修复所有编译器警告。
int i;`
关于print()
函数的问题,函数原型是错误的。 在大多数表达式中,包括函数调用在内,数组会衰减为指向其第一个元素的指针。 现在,像struct map map_data[ROW][COL]
这样的2d数组实际上是COL
元素的ROW
数组的数组。 也就是说,此数组的每一行都具有struct map map_data[COL]
。 发生指针衰减时,结果是指向第一个元素的指针,后者是指向数组的指针(而不是指向map
struct
的指针)。 表达这种指向数组的指针的语法是: struct map (*ptr)[COL]
。 因此,函数原型应为:
void print(struct map (*map_data)[COL]);
要解决通过更新显示以显示找到的宝藏的问题,请在打印沙子之前检查是否找到了宝藏,并且仅在未找到宝藏时才打印沙子:
for(i=0; i<ROW; i++) {
for (j=0; j<COL; j++) {
int sand = map_data[i][j].sand;
if (sand > 0) {
printf("%ds\t", sand);
} else {
printf("%dT\t", map_data[i][j].treasure);
}
}
printf("\n");
}
关于输入验证的一些评论是有序的。 使用带有scanf()
系列函数的%s
或%[]
指令读取字符串输入时,请始终指定最大宽度。 否则可能导致缓冲区溢出和未定义的行为。
注意scanf()
和family返回成功分配的数量; 应该检查该值以确保输入符合预期。 在发布的代码中,如果用户巧妙地从键盘发出文件结束信号,则scanf()
将返回而无需进行分配。 由于filename[]
未初始化,因此在使用filename
时会导致未定义的行为。 相反,请尝试如下操作:
if (scanf("%19s", filename) < 1) {
fprintf(stderr, "Input error\n");
exit(EXIT_FAILURE);
}
验证打开文件的尝试是否成功也至关重要。 当文件继续打开时好像无法成功打开文件一样无法打开时,将发生未定义的行为。 fopen()
在失败时返回空指针:
ifp = fopen(filename, "r");
if (ifp == NULL) {
fprintf(stderr, "Unable to open file %s\n", filename);
exit(EXIT_FAILURE);
}
这个故事的寓意是,您应该检查从返回有意义值的任何函数返回的值。
由于无法在此处验证输入,因此还可能造成麻烦:
scanf("%d %d", &x, &y);
map_data[x-1][y-1].sand = map_data[x-1][y-1].sand - pirate_data[crew].dig;
如果用户输入非数字输入,则不会在关联变量中存储任何值。 充其量由于使用先前存储的值而导致令人惊讶的行为。 最糟糕的是,当关联变量的值不确定(例如,未初始化)时,这将导致不确定的行为。 此外,用户可能在此处输入非正数,从而导致负数组索引和不确定的行为。 否则,用户可能会输入太大的值,从而导致尝试进行越界数组访问和未定义的行为。 此外,即使负值, sand
构件也会减少; 这可能是理想的,也可能不是理想的,但是对于不道德的勤劳的盗版者和恶意用户,这可能导致带符号整数溢出的不确定行为。
验证所有输入,尤其是用户输入,这些输入永远不可信任,并且始终被视为恶意。 检查scanf()
返回的值,以确保输入至少大致符合预期,并检查输入值是否在可接受的范围内。 如何处理错误的输入取决于程序员。 一种选择是再次提示输入正确的内容:
while (scanf("%d %d", &x, &y) < 2
|| x < 1
|| x > COL
|| y < 1
|| y > ROW) {
printf("Please enter numbers in the ranges [1, %d] [1, %d]\n",
ROW, COL);
}
map_data[x-1][y-1].sand = map_data[x-1][y-1].sand - pirate_data[crew].dig;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.