我无法弄清楚std :: string substr

时间:2015-03-07 00:13:43

标签: c++ string

我的字体文件名提取器无效... filename_:".\\Source\\AlexBrush-Regular.ttf" 我正在使用

sprintf(buffer, "\nFont Name:%s \nNumber of errors: %d\nAscent %d High +%d Descent -%d Low -%d!", 
                font->filename_.substr( font->filename_.find_last_of('\\'), font->filename_.length() ), hitcount, Ascent, Descent, High, Low);

我的输出看起来像 buffer 0x008aecbc "\nFont Name:ÀëŠ \nNumber of errors: 12688232\nAscent -858993460 High +-858993460 Descent --858993460 Low -22!"

3 个答案:

答案 0 :(得分:1)

只需使用basename(font->filename_.c_str()),它完全符合您的要求,并且与平台无关。

答案 1 :(得分:1)

我尝试用一​​个小例子重现你的问题:

#include <string>
#include <iostream>

using namespace std;

int main()
{
    string filename(".\\Source\\AlexBrush-Regular.ttf");

    cout << filename.substr(filename.find_last_of('\\') + 1) << endl;

    return 0;
}

输出为:
AlexBrush-Regular.ttf

首先,我添加&#34; 1&#34;到第一个参数,因为函数 find_last_of()将搜索最后一个字符的位置,我不认为你想将它包含在输出中。
其次,我删除了第二个参数,因为默认值是string :: npos,它表示直到字符串结尾的所有字符。

如果您总是遇到问题,请更具体地了解您的需求。

答案 2 :(得分:1)

考虑到您正在使用stringstream,使用C ++工具(即std::string)而不是C工具来解决这个问题会更好。在这种情况下,请参阅this snippet here了解如何执行此操作。

如果您坚持使用sprintf,则必须获取基础c-string,您可以将其称为:

const std::string mystr("foo");
const char *mycstr(mystr.c_str());