指针给出整个数组而不是 C++ RayLib 中的一个字符
Posted
技术标签:
【中文标题】指针给出整个数组而不是 C++ RayLib 中的一个字符【英文标题】:Pointer gives whole array instead of one character in C++ RayLib 【发布时间】:2020-08-17 18:11:25 【问题描述】:我对 C++ 非常陌生,因此决定开始使用 RayLib 作为图形引擎制作井字游戏。 下面的代码设置一个屏幕,绘制网格并检查输入。 我正在处理的部分是在单击的字段中显示 X 或 O。 我终于得到了绘制文本的程序,但它似乎绘制了整个数组而不是一个字母。
#include "raylib.h"
#include <string.h>
#include <stdio.h>
#include <math.h>
int main(void)
//INITIALIZE//
int screenWidth = 750;
int screenHeight = 750;
char matrix[9] = 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E';
char currentPlayer = 'X';
InitWindow(screenWidth, screenHeight, "raylib [core] example - basic window");
SetTargetFPS(60);
while (!WindowShouldClose())
//INPUT//
if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
int mouseX = GetMouseX();
int mouseY = GetMouseY();
double x = floor(mouseX/250);
double y = floor(mouseY/250);
int index = x + 3*y;
matrix[index] = currentPlayer;
currentPlayer = (currentPlayer == 'X') ? 'O' : 'X';
//DRAWING//
BeginDrawing();
ClearBackground(WHITE);
for (int i = 1; i < 3; i++)
int num = i*250;
DrawLine(num, 0, num, screenWidth, LIGHTGRAY);
DrawLine(0, num, screenHeight, num, LIGHTGRAY);
//Code I was working on
for (int i = 0; i < 9; i++)
if (matrix[i] != 'E')
int textX = 115 + i*250 - (i%3)*750;
int textY = 115 + (i%3)*250;
char text = matrix[i];
DrawText(&text, textX, textY, 20, LIGHTGRAY); //The problem is here
EndDrawing();
CloseWindow();
return 0;
当我单击左上角的单元格绘制 X 时,它会改为绘制“XXEEEEEEEE0?D”。 有谁知道如何从数组中只绘制一个字符?
提前致谢!
【问题讨论】:
不知道 raylib 我希望 DrawText 可能不会绘制单个字符,如果你会传递文本而不是 &text。 如果DrawText
采用 char*
则它假定为 C 字符串。您正在传递一个无效的字符。它必须被 NUL 终止。试试char text[2] = matrix[i], 0
。
【参考方案1】:
C 风格的字符串以空字符 (\0
) 结尾,因此您必须添加它,否则您将其读取到越界并调用 取消定义行为。
因此,
char text = matrix[i];
应该是
char text[] = matrix[i], '\0';
和
DrawText(&text, textX, textY, 20, LIGHTGRAY);
应该是
DrawText(text, textX, textY, 20, LIGHTGRAY);
(在text
之前删除&
)
【讨论】:
【参考方案2】:DrawText()
需要一个以空字符结尾的字符串作为输入,但您却给了它一个 char
。改变这个:
char text = matrix[i];
DrawText(&text, ...);
到这里:
char text[2] = matrix[i], '\0';
DrawText(text, ...);
【讨论】:
这是哪个版本的 DrawText?当然不是这里的那个:docs.microsoft.com/en-us/windows/win32/api/winuser/… @SergeyA 不,它不是来自 Win32 API 的那个。 OP说他们正在使用RayLib图形库,它在text
模块中有自己的DrawText()
函数:void DrawText(const char *text, int posX, int posY, int fontSize, Color color);
【参考方案3】:
你可以这样做:
char text = matrix[i];
char shortenedText[2] = 0, 0;
shortenedText[0] = text;
DrawText(shortenedText, textX, textY, 20, LIGHTGRAY); //The problem is here
基本上只用一个字符构建一个非常小的字符串。
【讨论】:
&shortenedText
应该是shortenedText
以上是关于指针给出整个数组而不是 C++ RayLib 中的一个字符的主要内容,如果未能解决你的问题,请参考以下文章
动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组