Sprintf与字符串

时间:2013-11-18 21:30:23

标签: c++

我正在尝试显示来自不同位置的图像。需要显示汽车,飞机,椅子等文件。我把那些话(汽车,飞机)放在一个文本文件中。我可以阅读单词但是当我把它们放在sprintf中时,我会得到无意义的字符。 我可以用cout<<*j<<endl;显示单词。但是cout<<filename<<endl;给了我奇怪的结果。

string words;
std::vector<string>list;
fstream file;
file.open("h.txt");
while(!file.eof())
{
    file >> words;
    list.push_back(words);
}
for(vector<string>::iterator j=list.begin(); j!=list.end(); j++)
{
    cout<<*j<<endl;
    for(i=1; i<5; i++)
    {
        sprintf( filename,"D:\\101_ObjectCategories\\%s\\image_%04d.jpg",*j,i);
        cout<<filename<<endl;

2 个答案:

答案 0 :(得分:2)

C函数sprintf()忽略了C ++类。如果您真的想使用std::string打印sprintf(),则需要提取C字符串:

sprintf(filename, "D:\\101_ObjectCategories\\%s\\image_%04d.jpg", j->c_str(), i);

您还应该将snprintf()与您传递的缓冲区大小filename一起使用,以防止溢出。就个人而言,我不会真的很烦,而是首先使用std::ostringstream

std::ostringstream out;
out << "D:\\101_ObjectCategories\\" << *j << "\\image_"
    << std::setfill('0') << std::setw(4) << i << ".jpg";
std::string filename = out.str();

(包括<sstream><iomanip>后)。

答案 1 :(得分:1)

使用必须使用* j.c_str():

sprintf( filename,"D:\\101_ObjectCategories\\%s\\image_%04d.jpg",*j.c_str(),i);

否则,字符串类本身会被显式转换为char *,这当然是垃圾:)