【问题标题】:Coordinates system using char array in C [closed]在C中使用char数组的坐标系[关闭]
【发布时间】:2017-04-06 15:16:46
【问题描述】:
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] 都充当“数字”的坐标,该数字作为 boardCoordinate 的索引值输入。

我尝试做的是设置一个系统,其中每个 boardCoordinate 都有一个包含坐标的 char 数组(字符串),并且可以使用返回 X 坐标的 getCoordinateX 值进行提取。

由于 geCoordinateX 函数中的一些指针错误,它似乎不起作用。

有什么想法可以解决这个问题,以便检索 X 坐标吗?在此先感谢:)

【问题讨论】:

  • 不要垃圾邮件标签! C++ 是一种不同的语言。
  • 你会发现使用 structs 更容易和更易于维护
  • 最好尽量避免使用 Struct 并在没有它们的情况下这样做@ChrisTurner :)
  • “最好尽量避免使用 Structs 并在没有它们的情况下这样做” - 所以你出于某种神秘的原因拒绝使用为此而设计的语言功能?抱歉,堆栈溢出专用于增强代码质量,而不是降低代码质量。
  • 我想知道你可以从不使用某个功能中学到什么......

标签: c arrays char coordinates


【解决方案1】:

您的方法存在一些问题,

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

    struct coordinate {
        int x;
        int y;
    };
    
  2. 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 的原因,您也可以像您的示例一样传递数组。

【讨论】:

  • 谢谢你! :) 你也有没有结构的实现吗?我试图避免将 Structs 用于学习目的。也感谢你解释清楚的帖子!
  • 如果您为此避免使用结构并使用字符串作为坐标,您将遇到麻烦,并且学习语言的困难比您想象的要多。相反,如果您还不想使用结构,请避免使用坐标系。结构是c语言中非常重要的一部分,没有它们你就写不出任何有趣的东西,而且它们一点也不难理解或使用。如果我现在正在学习 c,我会避免使用指针和字符串,但不会使用结构。
  • @Imdad 还注意到其他人也提出了这个解决方案,这是因为他们是经验丰富的 c 程序员,他们理解为什么这是最简单、更直接的解决方案。
【解决方案2】:

要走的路是struct,正如另一个答案中已经解释的那样(请参阅https://stackoverflow.com/a/43259364/4386427)。

但是你评论了:

最好尽量避免使用结构体并在没有它们的情况下这样做

好的,如果您真的想将坐标保存为逗号分隔的字符串,即"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

重复一遍:可以使用文本字符串来完成,但最好的方法是 @Iharob Al Asimi 解释的 struct

【讨论】:

    【解决方案3】:

    在评论中,你说:

    您是否也有没有 Structs 的实现?我试图避免将 Structs 用于学习目的。也感谢你解释清楚的帖子!

    您可以使用 int 来存储坐标。如果坐标值限制在 0-9 之间,可以使用数字x*10 + y 来表示。如果坐标值限制在 0-99 之间,可以使用数字x*100 + y 来表示。

    例如假设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,可以细化。

    【讨论】:

      【解决方案4】:

      你可以像这样使用一个 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] 一样访问它,这将从{0,2} 返回2

      如果您想打印出“x,y”,您可以随时这样做:

      std::cout << coords[i][0] << ',' << coords[i][1] << std::endl;
      

      【讨论】:

        猜你喜欢
        • 2018-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多