C ++ строка как - PullRequest
       60

C ++ строка как

7 голосов
/ 24 марта 2010

Это очень простой вопрос, и я чувствую себя глупо, когда спрашиваю его, но мне не хватает времени, и мне нужно разобраться:)

Мне просто нужно знать, как создать строку, содержащую текст и другие переменные. Например, в Java я могу просто сделать это:

String someString;

for(int i = 0; i>10; i++){

someString = ("this text has printed " + i + " times"); //how do I create this line in C++?

System.out.println(someString);

i++;

}

РЕДАКТИРОВАТЬ 4:

Хорошо, приведенный ниже ответ Рахула Г. работает довольно хорошо, и программа компилируется и все в порядке, но когда я запускаю ее вместо того, чтобы получить нужную строку для имени файла, я получаю несколько цифр. Например: << "frame " << i << " .jpg" создает: «013679000.jpg» вместо «frame 0.jpg», как я хочу. Есть мысли?

for(int i = 0; frames; i++)
{  
  frame = cvQueryFrame(capture); 
  std::string s = static_cast<std::ostringstream &>(std::ostringstream() << argv[1] <<  i << " .jpg").str(); 
  cvSaveImage(s.c_str(), frame);
} 

Ответы [ 8 ]

12 голосов
/ 24 марта 2010

Вы можете использовать строковые потоки для этого:

for (int i = 0; i < 10; i++) {
    std::ostringstream ss;
    ss << "this text has printed " << i << " times";
    std::cout << ss.str() << std::endl;
}
7 голосов
/ 24 марта 2010

Java:

int i = 5;
double d = 2.23606798;
String s = "Square root of "+i+" is "+d;

C ++:

int i = 5;
double d = 2.23606798;
std::ostringstream oss;
oss << "Square root of " << i << " is " << d;
std::string s = oss.str();
// If you need C style string...
char const *s0 = s.c_str();

Обратите внимание, что класс std::ostringstream находится в заголовке <sstream>.

Edit:

Ваш код (исправлено):

for(int i = 0; frames; i++) { 
  frame = cvQueryFrame(capture);
  std::ostringstream oss;
  oss << "frame " << i << " .jpg";
  cvSaveImage(oss.str().c_str(), frame);
}
3 голосов
/ 24 марта 2010

Есть еще один способ сделать это: использовать boost :: lexical_cast (я знаю, что он основан на std :: stringstream, но это довольно полезно):

#include <string>
#include <iostream>
#include <boost\lexical_cast.hpp>

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    std::string result = "this text has printed " + boost::lexical_cast<std::string, int>(i) + " times";
    std::cout<<result<<std::endl;
    std::cin.get();
    return 0;
}
1 голос
/ 24 марта 2010

Я разместил некоторый код для создания строк на месте здесь (в основном это оболочка, чтобы скрыть std::ostringstream и сделать код вызова чище). Использование будет:

void f( std::string const & ); // or std::string, but not std::string&

int var = 5;
f( make_string() << "prefix " << var << " postfix" );

Так как вам нужен const char *, вы должны использовать:

void g( const char * );
std::string s = make_string() << "prefix " << var << " postfix";
g( s.str() );
0 голосов
/ 24 марта 2010

Это версия вашего последнего кода с удаленными вашими специальными функциями, поэтому я могу скомпилировать ее. Компилируется и работает:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main() {

    for(int i = 0; i < 10; i++) { 
        ostringstream os;
        os << "frame" << i << " .jpg";
        string s = os.str();
        cout << s << "\n"; 
     }
}
0 голосов
/ 24 марта 2010

Как насчет cvSaveImage(oss.str().c_str(), frame);? Это создаст старую строку типа C с нулевым символом в конце, которая, как мы надеемся, примет OpenCV.

0 голосов
/ 24 марта 2010

Если вы получаете ошибку «error C2664:« cvSaveImage »: невозможно преобразовать параметр 1 из« std :: basic_string <_Elem, _Traits, _Ax> »в« const char * », тогда вам нужна строка в стиле C не C ++:

cvSaveImage(oss.str().c_str(), frame);
0 голосов
/ 24 марта 2010

Вы знаете, что в вашем коде есть ошибка ?? Вы увеличиваете i в операторе for () и в конце цикла !! Но я отвлекся.

Использовать printf:

printf («Этот текст напечатан% d раз \ n», i)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...