指针给出整个数组而不是 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之前删除&amp;

【讨论】:

【参考方案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

基本上只用一个字符构建一个非常小的字符串。

【讨论】:

&amp;shortenedText 应该是shortenedText

以上是关于指针给出整个数组而不是 C++ RayLib 中的一个字符的主要内容,如果未能解决你的问题,请参考以下文章

滚动背景图像,不能隐藏接缝,c ++ raylib

无法分配给 C++ 中的指针数组

如何将 Raylib 添加到 VS 代码中?

动态数组 C++,新 Obj[size] 的麻烦只创建 1 个对象指针,而不是数组

访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组

数组分配中的 C++ 堆内存只会弄乱第一个数组而不是第二个数组