gpt4 book ai didi

c++ - 界面上打印奇怪的文字

转载 作者:行者123 更新时间:2023-11-28 02:17:50 25 4
gpt4 key购买 nike

我不知道这里发生了什么,虽然它很酷而且奇怪地令人毛骨悚然,但这并不是我的真实想法。

基本上;我正在尝试实现一个在黑色界面上缓慢键入文本的程序。我正在使用 SDL2 和 SDL2_TTF 来完成此任务,到目前为止一切顺利。

目前,我让它在黑屏上输入“Hey ;)”,但实际情况如下: Interesting text.

忽略 FPS 计数器,那只是 Nvidia。

老实说,我不知道发生了什么,我使用的字体是“Hack-Regular.ttf”。

进入代码:

#include<iostream>
#include<SDL.h>
#include<string>
#include<SDL_ttf.h>


void handleEvents(SDL_Event e, bool* quit){
while(SDL_PollEvent(&e) > 0){
if(e.type == SDL_QUIT){
*quit = true;
}
}
}

void render(SDL_Renderer* renderer, SDL_Texture* textToRender, SDL_Rect srcrect, SDL_Rect dstrect){
SDL_RenderClear(renderer);

SDL_RenderCopy(renderer, textToRender, &srcrect, &dstrect);

SDL_RenderPresent(renderer);
}

void printToConsole(std::string message, char* text){
for(int i = 0; i < message.length(); i++){
*text = *text + message.at(i);
SDL_Delay(30);
}
}

void start(char text){
printToConsole("Hey ;)", &text);
}

int main( int argc, char *argv[] ) {
SDL_Init(SDL_INIT_EVERYTHING);
TTF_Init();
SDL_Window* window = SDL_CreateWindow("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 600, 600, SDL_RENDERER_ACCELERATED);
SDL_Renderer* renderer = SDL_CreateRenderer(window, 0, 0);

char text = 'asdf'; //This is the text that has been rendered.
bool quit = false;
SDL_Event e;

TTF_Font* font = TTF_OpenFont("Hack-Regular.ttf", 28);
SDL_Color color = {255, 255, 255};
SDL_Surface* textSurface;
SDL_Texture* textTexture;

SDL_Rect srcrect;
SDL_Rect dstrect;

srcrect.x = 0;
srcrect.y = 0;
srcrect.w = 100;
srcrect.h = 32;
dstrect.x = 640/2;
dstrect.y = 480/2;
dstrect.w = 100;
dstrect.h = 32;

while(!quit){
handleEvents(e, &quit);
render(renderer, textTexture, srcrect, dstrect);

start(text);

textSurface = TTF_RenderText_Solid(font, &text, color);
textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
}

SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);

window = NULL;
renderer = NULL;
TTF_Quit();
SDL_Quit();
return 0;
}

如果难以阅读,我深表歉意,我觉得没有必要使用多个类。

需要注意的是,“f”是“asdf”的最后一个字母,我将文本定义为最初,不知道为什么从那里开始。

最佳答案

在下面的语句中,您定义了一个变量,它占用 1 个字节的内存,并存储整数值 102,也就是 ascii 格式的“f”:

char text = 'asdf'; //This is the text that has been rendered.

上面的说法有几个问题:

  • 单个char变量只能存储一个字符,一个字节的内存。您正在尝试分配 4。仅保留最后一个值。
  • 你正试图使用​​单个字符,而你打算使用 'c-string' .
  • 您正在对 C 字符串使用单引号语法。
  • 由于该变量仅存储一个字节,因此该单个值之后的下一个内存字节是未定义的 - 它来自程序中其他地方的任意内存,可能是堆栈上接下来分配的任何值。
  • 如果您已正确声明该变量,您稍后将尝试写入只读内存,因为 c 字符串文字通常加载到只读内存中。

然后通过获取变量的地址并将其作为 char* 类型传递,将该值传递给渲染例程:

textSurface = TTF_RenderText_Solid(font, &text, color);

但是,在 C/C++ 中,char* 通常用于存储指向 'c-string' 的指针。 - 即具有最终空终止符的字符序列。在接受 char* 参数作为 C 字符串的 API 中,您需要传递一个指向末尾带有空终止符的字符序列的指针。

因为它期望传递的值是一个 c 字符串,它会盲目地从内存中读取直到它看到一个值为 0 的字节。因为它正在读取你为该变量预留的内存的末尾(这是只有一个字节),它将读取任意内存,直到它幸运地在某处找到一个零 - 这就是为什么它显示垃圾。

...

你如何解决这个问题?好吧,这取决于您将如何获得琴弦。

使用您提供的代码,没有真正的理由分配您自己的 C 字符串。如果你有 string 对象,你可以使用 c_str() 方法访问一个 char* c-string 兼容缓冲区;只要您未修改 string,返回的指针就是有效的,并且由于返回的指针属于 string,因此您无需担心清理它.

// Use the string class's implicit conversion from a c-string literal to 
// a `std::string` object.
std::string text = "hello world";

...

while(!quit){
handleEvents(e, &quit);
render(renderer, textTexture, srcrect, dstrect);

// Note the lack of a call to the `start` method here.

textSurface = TTF_RenderText_Solid(font, text.c_str(), color);
textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
}

如果你想有引用语义——也就是说,有一个你在 main 中声明的 text 变量,传递给你的程序的其他部分修改它,然后让你的 main 打印无论设置什么值,您都可以执行以下操作:

#include <stdlib.h>
#include <stdio.h>
#include <string>

using namespace std;

void start(string& text );

int main() {

// Create an empty 'string' object', invoking the default constructor;
// This gives us a valid empty string object.
string text;

...

while(true) {
...
// The `text` variable is passed by reference.
start(text);

textSurface = TTF_RenderText_Solid(font, text.c_str(), color);
...
}
}

// Takes a string object by reference, and modifies it to fill it
// with our desired text.
void start( string& text ) {
text += "Hello";
text += " ";
text += "World";
}

关于c++ - 界面上打印奇怪的文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33507475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com