【问题标题】:How do I concatenate a string and an integer to make a filename? [duplicate]如何连接字符串和整数以创建文件名? [复制]
【发布时间】:2013-03-31 00:53:03
【问题描述】:

我有一系列文件(New1.BMP、New2.BMP、...、New10.BMP)。

我需要创建一个变量来存储上述文件的名称,然后在另一个代码中使用它。

我当前的代码:

int LengthFiles =10;
char FilePrefix[100]="New";//This is actually passed to the function. Am changing it here for simplicity
char str[200],StrNumber[1];//str holds the file name in the end. StrNumber is used to convert number value to character
 SDL_Surface *DDBImage[9]; // This is a SDL (Simple DIrectMedia Library) declaration.
 for (int l=0;l<LengthFiles ;l++)
     {      
    itoa(l, StrNumber, 1);
    strcat(str,FilePrefix);strcat(str,StrNumber);strcat(str,".BMP");
    DDBImage[l]= SDL_DisplayFormat(SDL_LoadBMP(str));

     }

如您所见,我不知道如何用 C++ 编写代码,我试图通过在线代码 sn-ps 来完成这项工作。这是它应该如何在 C/C++ 中工作的方式,即动态创建变量。

如何最好地处理它?

【问题讨论】:

  • 查看itoa的参数。在 C++ 中,这只是 std::string name = "New" + std::to_string(l) + ".BMP";
  • 变量是静态的东西。你不能像在解释语言中那样创建它们......
  • @Synxis 问题不在于创建具有动态名称的变量,而在于创建文件名。
  • C++ 是一种危险的编程语言。
  • “我不知道如何用 C++ 编写代码”。因此,在加入 SDL 之前,您应该建立一些基础。这个建议对每种语言都有效,尤其是 C++。

标签: c++ sdl


【解决方案1】:

你原来的问题标题有点误导,因为你真正想做的只是连接一个字符串和一个整数。

在 C++ 中,您可能会使用 stringstream

stringstream ss;
ss << "New" << l << ".bmp";

然后得到一个string变量:

string filename = ss.str();

最后将 C 字符串传递给 SDL 函数,使用 c_str():

SDL_LoadBMP(filename.c_str())

DDBImage 的声明错误。您需要一个长度为 10 的数组,但您声明它的长度为 9。如果您将 LengthFiles 设为常量,您可以写入 SDL_Surface *DDBImage[LengthFiles],因此请确保该数组的长度正确。

代码可能如下所示:

const int FileCount = 10;
SDL_Surface *DDBImage[FileCount];
for (int index=0; index<FileCount; index++)
{      
    stringstream ss;
    ss << "New" << index << ".bmp";
    string filename = ss.str();
    DDBImage[index] = SDL_DisplayFormat(SDL_LoadBMP(filename.c_str()));
}

如果您的文件名确实以New1.bmp 开头,那么您需要调整索引:

ss << "New" << index+1 << ".bmp";

最后,如果您需要扩展它以处理在运行时确定的可变数量的文件,那么您应该使用vector&lt;*DDBImage&gt; 而不是原始数组。使用vector&lt;&gt; 允许您让C++ 标准库为您处理低级内存管理。事实上,当您在 C++ 编程时发现自己分配内存时,您应该问自己是否已经有标准库的某些部分可以为您分配内存。

【讨论】:

  • 太棒了!!,非常感谢@David Heffernan。非常感激。尤其是您粘贴的新代码。它还消除了我会得到的 const char * 转换错误。
  • @Foal 好。如果你打算使用 C++,试着忘记你对 C 的了解,并学习如何以 C++ 的方式做事。你的生活会轻松很多。
【解决方案2】:

您可以使用格式化字符串 printf... 大致沿线

sprintf( str, "%s%d.BMP", prefix, fileNumber );

看看http://www.cplusplus.com/reference/cstdio/sprintf/

【讨论】:

  • 1.不要链接到 linux.die.net。内核文档位于 kernel.org。 2. 不要链接到 linux 文档来引用 C 标准库函数。 3. 我实际上不是 FWIW 的反对者!
  • 已修复 -- 已编辑以引用 c++ 参考。 PS:不管你喜不喜欢我选择的链接,答案都是对的。
猜你喜欢
  • 2022-08-06
  • 2015-12-07
  • 2020-08-27
  • 2013-10-09
  • 1970-01-01
  • 2023-03-07
  • 2011-02-20
  • 2016-07-03
相关资源
最近更新 更多