字符串提取

字符串提取

问题描述:

目前我正在使用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,但事实证明,这是一个“弓”。文件名只是一个派生特权。