使用C中的char数组来协调系统

时间:2017-04-06 15:16:47

标签: c arrays char coordinates

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坐标?在此先感谢:)

4 个答案:

答案 0 :(得分:4)

您的方法存在一些问题,

  1. 您根本不需要坐标作为字符串,只需创建一个结构

    struct coordinate {
        int x;
        int y;
    };
    
  2. char *指针的类型不是char,您显然将指向类型为const char *的字符串文字的指针存储到带有元素的char[]类型的数组中类型为char,它可能会编译,因为char是一个整数类型但它不正确,因为转换不保证定义的行为,实际上它是未定义的,如c标准中所指定的。但是,它应该生成一些有关转换的警告。

  3. 如果您使用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或更高(或负数),则需要更多代码才能提取正确xy(每个字符串的空格大于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;