用字符串Sprintf

  • 本文关键字:Sprintf 字符串 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;

C函数sprintf()忽略了C++类。如果你真的想用sprintf()打印std::string,你需要提取一个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>之后)。

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

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

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

最新更新