为什么这个函数总是返回一个空字符串?
我知道变量的范围,但我认为该函数会返回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
答案 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
。