char boardCoordinates[15];
void setupBoardCoordinates(char boardCoordinates[])
{
boardCoordinates[0] = "0,0";
boardCoordinates[1] = "0,1";
boardCoordinates[2] = "1,1";
boardCoordinates[3] = "0,2";
boardCoordinates[4] = "1,2";
boardCoordinates[5] = "2,2";
boardCoordinates[6] = "0,3";
boardCoordinates[7] = "1,3";
boardCoordinates[8] = "2,3";
boardCoordinates[9] = "3,3";
boardCoordinates[10] = "0,4";
boardCoordinates[11] = "1,4";
boardCoordinates[12] = "2,4";
boardCoordinates[13] = "3,4";
boardCoordinates[14] = "4,4";
}
int getCoordinateX(const char boardCoordinates[], int number)
{
char coordinates[] = boardCoordinates[number];
char xValue = coordinates[2];
return (int) xValue;
}
所以我正在尝试设置一个坐标系,其中每个boardCoordinate [number]充当一个“number”的坐标,一个作为boardCoordinate的索引值输入。
我尝试做的是设置一个系统,其中每个boardCoordinate都有一个包含坐标的char数组(字符串),并且可以使用返回X坐标的getCoordinateX值进行提取。
由于geCoordinateX函数中存在一些指针错误,它似乎无法正常工作。
我有什么想法可以解决这个问题,以便检索X坐标?在此先感谢:)
答案 0 :(得分:4)
您的方法存在一些问题,
您根本不需要坐标作为字符串,只需创建一个结构
struct coordinate {
int x;
int y;
};
char *
指针的类型不是char
,您显然将指向类型为const char *
的字符串文字的指针存储到带有元素的char[]
类型的数组中类型为char
,它可能会编译,因为char
是一个整数类型但它不正确,因为转换不保证定义的行为,实际上它是未定义的,如c标准中所指定的。但是,它应该生成一些有关转换的警告。
如果您使用struct coordinate
,则可以写
const struct coordinate *
get_coordinate_x(int index)
{
static const struct coordinate board_coordinates[15] = {
{0, 0}, {0, 1}, ..., {4, 4}
};
return &board_coordinates[index];
}
或等效的,只记得你不能返回指向局部变量的指针,因为你会导致未定义的行为,这就是我使用static
的原因,你也可以像你的例子一样传递数组。 / p>
答案 1 :(得分:2)
前进的方法是struct
,正如另一个答案中所述(见https://stackoverflow.com/a/43259364/4386427)。
但你评论道:
最好避免使用Structs并在没有它们的情况下进行操作
好的,如果你真的想把坐标保存为逗号分隔的字符串,即"x,y"
,那么原因可能就是你的当前代码存在一些问题。
第一
char boardCoordinates[15];
这不是15个字符串的数组。它是一个单独的字符串,可容纳15个字符,包括零终止。要制作15个长度最多为3的字符串,您需要:
char boardCoordinates[15][4]; // Notice 4 to make room for string termination
下一个问题是作业。而不是
boardCoordinates[0] = "0,0";
你需要
strcpy(boardCoordinates[0], "0,0");
或者您可以将变量初始化为:
char boardCoordinates[15][4] = {"0,0", "0,1", "1,1", ...... };
对于getCoordinateX
功能,您可以执行以下操作:
int getCoordinateX(const char boardCoordinates[][4], int number)
{
int xValue = boardCoordinates[number][0] - '0';
return xValue;
}
但通知 仅适用于0到9之间的坐标。如果坐标可以是10或更高(或负数),则需要更多代码才能提取正确x
和y
(每个字符串的空格大于4)。
所以这里有一个小样本:
#include <stdio.h>
int getCoordinateX(const char boardCoordinates[][4], int number)
{
int xValue = boardCoordinates[number][0] - '0';
return xValue;
}
int getCoordinateY(const char boardCoordinates[][4], int number)
{
int yValue = boardCoordinates[number][2] - '0';
return yValue;
}
int main(void) {
char boardCoordinates[2][4] = {"1,2", "3,4"};
printf("x[0]=%d\n", getCoordinateX(boardCoordinates, 0));
printf("y[0]=%d\n", getCoordinateY(boardCoordinates, 0));
printf("x[1]=%d\n", getCoordinateX(boardCoordinates, 1));
printf("y[1]=%d\n", getCoordinateY(boardCoordinates, 1));
return 0;
}
输出:
x[0]=1
y[0]=2
x[1]=3
y[1]=4
重试:可以使用文字字符串完成,但最好的方法是struct
,如@Iharob Al Asimi所解释
答案 2 :(得分:1)
在评论中,你说:
你是否也有没有Structs的实现?我试图避免使用Structs进行学习。还要感谢你解释得很好的帖子!
您可以使用int来存储坐标。如果坐标值限制为0-9,则可以使用数字x*10 + y
来表示它们。如果坐标值限制为0-99,您可以使用数字x*100 + y
来表示它们。
E.g。假设x*10 + y
:
int boardCoordinates[15];
void setupBoardCoordinates(char boardCoordinates[])
{
boardCoordinates[0] = 0;
boardCoordinates[1] = 1;
boardCoordinates[2] = 11;
boardCoordinates[3] = 2;
boardCoordinates[4] = 12;
boardCoordinates[5] = 22;
boardCoordinates[6] = 3;
boardCoordinates[7] = 13;
boardCoordinates[8] = 23;
boardCoordinates[9] = 33;
boardCoordinates[10] = 4;
boardCoordinates[11] = 14;
boardCoordinates[12] = 24;
boardCoordinates[13] = 34;
boardCoordinates[14] = 44;
}
int getCoordinateX(const char boardCoordinates[], int number)
{
return boardCoordinates[number]/10;
}
int getCoordinateY(const char boardCoordinates[], int number)
{
return boardCoordinates[number]%10;
}
如果您需要使用x*100 + y
,可以对其进行优化。
答案 3 :(得分:1)
你可以像这样使用一个int数组:
int coords[15][2] = {{0,0},{0,1},{1,1},{0,2},{1,2},{2,2},{0,3},{1,3},{2,3},{3,3},{0,4},{1,4},{2,4},{3,4},{4,4}};
像coords[3][1]
一样访问它,这将从2
{0,2}
如果您想打印出“x,y”,您可以随时执行:
std::cout << coords[i][0] << ',' << coords[i][1] << std::endl;