【问题标题】:C++ Parsing string to find occurrenceC ++解析字符串以查找出现
【发布时间】:2012-09-30 04:09:04
【问题描述】:

所以我需要通过以下方式解析用户的输入: 如果用户输入

C:\Program\Folder\NextFolder\File.txt

C:\Program\Folder\NextFolder\File.txt\

然后我想删除文件并保存

C:\Program\Folder\NextFolder\

我基本上想从末尾开始找到\ 的第一次出现,如果他们放了一个斜杠,那么我可以找到第二次出现。我可以用这段代码先或第二次区分:

input.substr(input.size()-1,1)!="/"

但我不明白如何从末尾找到第一次出现开始。有什么想法吗?

【问题讨论】:

  • C:\Program\Folder\NextFolder\File.txt\ 不是文件,这是目录!

标签: c++ string parsing input substring


【解决方案1】:

这个

input.substr(input.size()-1,1)!="/"

效率非常低*。使用:

if( ! input.empty() && input[ input.length() - 1 ] == '/' )
{
    // something
}

从头开始查找第一次出现的事物与从头开始查找最后一个“事物”相同。你可以使用find_last_of,或者rfind,或者,你甚至可以使用标准的find,结合rbeginrend


*std::string::substr 创建一个子字符串,"/" 可能创建另一个(取决于std::string::operator!=),比较两个字符串并销毁临时对象。


注意

C:\Program\Folder\NextFolder\File.txt\

不是文件的路径,而是目录。

【讨论】:

    【解决方案2】:

    如果您的inputstd::string(我认为是)类型,您可以使用string::find 进行正常搜索,使用string::rfind 进行反向搜索(从头到尾)并检查最后一个字符你不需要也不应该使用substr,因为它创建一个新的字符串实例只是为了检查一个字符。你可以直接说if( input.back() == '/' )

    【讨论】:

      【解决方案3】:

      如果您使用的是 C++ 字符串,请尝试在字符串上使用 reverse iterator,以编写您自己的逻辑来判断什么是可接受的,什么是不可接受的。我提供的链接中有一个明确的示例。

      据我猜测,您正在尝试存储给定路径的目录名称,该路径可能以文件或目录结尾。

      如果是这种情况,您最好删除结尾的“\”并检查它是否是目录,如果是则停止,否则继续。

      或者,您可以尝试将 '\' 上的字符串分成两部分。一些相关笔记here.

      如果这些是实际的文件名(看起来您使用的是 Windows),那么也请尝试使用 _splitpath 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 2019-01-15
        • 1970-01-01
        相关资源
        最近更新 更多