为什么函数返回空字符串

时间:2015-03-22 01:42:10

标签: c++ string

为什么这个函数总是返回一个空字符串?

我知道变量的范围,但我认为该函数会返回std :: string res的副本吗?

string getNumberOfLines(string absFilePath)
{
    int nLines = 0;
    ifstream inFile(absFilePath.c_str());

    if (!inFile)
        return "no lines";

    char c;
    while (inFile.get(c))
    {
        if (c == '\n')
            nLines++;
    }   

    string res;
    sprintf(&res[0], "%d lines.", nLines);
    puts(res.c_str()); // prints "40 lines" or etc.
    return res;
}

puts(getNumberOfLines("f.txt").c_str()); // outputs nothing

2 个答案:

答案 0 :(得分:2)

您正在使用reference std::basic_string::operator[](size_t pos)获取字符串中的第一个元素,然后使用&运算符获取其地址。但是,根据函数的规范,如果pos == size那么它是未定义的行为。 C ++ 11标准,草案N3337, [string.access] basic_string元素访问(强调我的):

  

1 需要: pos <= size()

     

2 如果*(begin() + pos),则返回 pos < size()。否则,返回对值为charT的{​​{1}}类型的对象的引用,其中修改对象会导致未定义的行为

您的字符串charT()中没有元素,因此大小为0,因此会产生未定义的行为。在此之后,没有其他任何东西可以被语言保护。

您应该使用res

std::ostringstream

答案 1 :(得分:0)

基本上你是想写一个空字符串。

创建std::string时,不会分配任何存储空间,因此您将零长度数组的地址传递给sprintf