1

我正在使用 C++/SDL 进行 PONG 克隆,并且我的所有图像都在程序启动的目录中。我成功地能够使用 GetCurrentDirectory() 找到该路径并使用 strcat() 打开文件以附加实际图像,它会加载正常,但这会改变原始值,这使得它在我尝试加载时无用下一个图片。我将如何在不更改原始值的情况下传递路径,或以其他方式解决此问题。

我当前的代码:

    TCHAR openingdirectorytemp [MAX_PATH];
    bgtexturesurf = SDL_LoadBMP(strcat(openingdirectorytemp, "\\bg.bmp"));
4

4 回答 4

1

使用实际的 C++ 字符串:

#include <string>

using std::string;

void child(const string str)
{
  str += ".suffix"; // parameter str is a copy of argument
}

void parent()
{
   string parents_string = "abc";
   child(parents_string);
   // parents_string is not modified
}

如果您必须TCHAR在 Windows API 世界中使用,请使用std::basic_string<TCHAR>

typedef std::basic_string<TCHAR> str_t; // now use str_t everywhere

所以代码变成了类似

void my_class::load_bg_bmp(const str_t &dir_path)
{
  str_t file_path = dir_path + _T("\\bg.bmp")l
  bgtexturesurf = SDL_LoadBMP(file_path.c_str()));
  // ...
}

TCHAR类型允许在窄字符和宽字符之间切换构建时间。使用没有意义TCHAR,但随后使用展开的窄字符串文字,如"\\bg.tmp".

另外,请注意,strcat未初始化的数组会调用未定义的行为。的第一个参数strcat必须是字符串:指向以空字符结尾的字符数组的第一个元素的指针。未初始化的数组不是字符串。

我们可以通过使用 C++ 字符串类来避免这种低级的麻烦。

于 2013-10-09T01:41:01.390 回答
0

如果您担心事情会发生变化,则需要在连接之前复制字符串。换句话说

string1 = "abc"
string2 = "def"
strcat(string1, string2);

结果是

string1 = "abcdef"

因为那是您要求程序执行的操作。相反,添加

strcpy(string3, string1)
strcat(string3, string2);

现在你将拥有

string1 = "abc" 
string3 = "abcdef"

当然,您需要确保分配了足够的空间等。

于 2013-10-09T01:39:24.037 回答
0

使用 c++ 后,您可以使用字符串来组成您的最终路径名:

string pathname(path);
pathname += "\\bg.bmp";

bgtexturesurf = SDL_LoadBMP(pathname.c_str());
于 2013-10-09T01:44:28.770 回答
0

尽管您可以按照其他答案的建议使用 C++ 字符串,但您仍然可以保留 C 方法。

您需要做的只是通过复制原始内容来创建另一个字符串,并将其用于 strcat:

TCHAR openingdirectorytemp [MAX_PATH];
TCHAR path [MAX_PATH];
strcpy(path, openingdirectorytemp);
bgtexturesurf = SDL_LoadBMP(strcat(path, "\\bg.bmp"));

通过这样做,您可以创建path具有单独内存空间的字符串,因此 strcat 不会影响openingdirectorytemp

于 2013-10-09T01:38:32.613 回答