字符串提取
目前我正在使用C++环境进行非常基本的游戏。这个游戏曾经是一个学校项目,但现在我已经完成了该编程课程,我想扩展我的技能,并在这个旧任务上增加一些兴趣。字符串提取
我已经做了很多我很满意的改变。我已将所有数据集中到文件夹层次结构中,并且已经获得了读取这些位置的代码。
然而,我的问题源于一直困扰着我的一个非常根本的缺陷。
为了访问,我用我已经使用了代码的图像数据:
string imageLocation = "..\\DATA\\Images\\";
string bowImage = imageLocation + "bow.png";
的问题是,当玩家在游戏键盘拿起一个项目我的代码应该使用的代码:
hud.addLine("You picked up a " + (*itt)->name() + "!");
打印到命令行,“你拿起弓!”。但相反,它显示“你拿起.. \ DATA \ Images \!”。
我集中我的数据之前我用:
name_(item_name.substr(0, item_name.find('.')))
在我的项目类的构造函数的项目名称印章,只是像弓或蜡烛。在我改变了我的数据结构之后,我意识到我将不得不改变我如何将这个名字切成同样简单的'弓'或'蜡烛'。
我已经改变了上面的代码,以反映我在数据结构的变化是:
name_(item_name.substr(item_name.find("..\\DATA\\Images\\"), item_name.find(".png")))
但不幸的是,因为我先前提到的这个代码改变是不工作,以及我计划的那样。
所以,现在我已经给出了真正的漫长的介绍我的问题是什么,这是我的问题。
如何提取两个部分之间不需要的字符串的中间部分?此外,你的目标的中间部分是未知的长度。
非常感谢您为您提供的任何帮助。如果您需要更多信息,请询问;我将非常乐意上传部分甚至是全部代码以获得更多帮助。再次非常感谢你。
看起来有错的一件事是substr的第二个参数应该是要复制的字符数,而不是位置。
item_name.find(“.. \ DATA \ Images \”)将返回子字符串“.. \ DATA \ Images \”开始的索引,但似乎您希望索引位于该索引处结束,因此您应该将“.. \ DATA \ Images \”的长度添加到find返回的索引。
另外,正如hamishmcn指出的那样,substr的第二个参数应该是要返回的字符数,这将是“.png”开始的索引减去“.. \ DATA \ Images \”结束的索引, 我认为。
所以结合保罗和我的想法,尝试这样的事情(细分为便于阅读):
string extn = item_name.substr(item_name.find_last_of(".png"));
string path = item_name.substr(0, item_name.find("..\\DATA\\Images\\"));
name_ = item_name.substr(path.size(), item_name.size() - extn.size());
如果您知道项目名称总是开始与” ..DATA你可以把它简化一点“等等(你可以将它存储在一个常量中,而不需要在字符串中搜索它)
编辑:改变的扩展寻找部分使用find_last_of
,如EarWicker所建议的(这避免了你的路径包含' .png'在扩展名之前的某处)
假设我理解正确的话,你的问题的短版本是:我怎么分割,所以我已删除的路径和扩展,只留下“标题”包含文件路径的字符串?
您需要find_last_of
方法。这摆脱路径:
std::size_type lastSlash = filePath.find_last_of('\\');
if (lastSlash == std::string::npos)
fileName = filePath;
else
fileName = filePath.substr(lastSlash + 1);
请注意,你可能想万一定义常量为\\
你需要改变它的其他平台。并非所有的OS文件系统都使用\\
来分隔路径段。
另外请注意,您还需要使用find_last_of
为扩展点为好,因为一般的文件名可以包含点,在他们的路径。只有最后一个指示扩展的开始:
std::size_type lastDot = fileName.find_last_of('.');
if (lastDot == std::string::npos)
{
title = fileName;
}
else
{
title = fileName.substr(0, lastDot);
extension = fileName.substr(lastDot + 1);
}
见http://msdn.microsoft.com/en-us/library/3y5atza0(VS.80).aspx
使用提高文件系统:
#include "boost/filesystem.hpp"
namespace fs = boost::filesystem;
void some_function(void)
{
string imageLocation = "..\\DATA\\Images\\";
string bowImage = imageLocation + "bow.png";
fs::path image_path(bowImage );
hud.addLine("You picked up a " + image_path.filename() + "!"); //prints: You picked up a bow!
在所有honeasty,你可能会从错误的临近结束这。
你的项目类应该有一个字符串“弓”,在一个私有成员。功能项目:: GetFilePath然后会(在运行时)做 “.. \ DATA \图片\” +这个 - >名称+ “巴纽”。
的“弓”项目对象的基本属性不是文件名bow.png,但事实证明,这是一个“弓”。文件名只是一个派生特权。