Ошибка C2664: «sprintf»: невозможно преобразовать параметр 1 из «std :: string» в «char *» - PullRequest
1 голос
/ 27 декабря 2011

Ниже приведена функция вставки в VC ++.Я получаю эту ошибку, когда я изменяю тип данных char на string, чтобы прочитать значение переменной количества в приведенном ниже коде.

static void Insert(t_analysis* analysis)    
{    
 _bstr_t strunitId;    
 _bstr_t strGdt=time(0);    
_bstr_t strvalue;   
    std::string str;
std::string commandStr = "insert into table1(unitid,g_time_dte_1,h_1,n_1,ch_1,co_1,im_1,ve_1,er_1) Values(123,'" + strGdt +"',";
    char tempBuf[50];
for (int j = 0; j < analysis->ubPeaksIntTab;j++ )
{   
    sprintf(tempBuf, "%d", (analysis->peak + j)->amount);//here it takes the adrress of amount but not the value of amount variable.
    str += commandStr + tempBuf;
    if(j!=analysis->ubPeaksIntTab-1)
       commandStr += ",";
}

commandStr += ")";
_ConnectionPtr pConn = NULL;

try
{       
    HRESULT hr = S_OK;
    CoInitialize(NULL);
    hr = pConn.CreateInstance((__uuidof(Connection)));
    _bstr_t strCon("Provider=SQLOLEDB;Dataq Source=MYPC\\SQLEXPRESS;Initial Catalog=keerth;User ID=sa;Password=password;Connect Timeout=30;");

    if(FAILED(hr))
    {
        printf("Error instantiating Connection object\n");

    }

    hr = pConn->Open(strCon,"sa","password",0);

    if(FAILED(hr))
    {
        printf("Error Opening Database object using ADO _ConnectionPtr \n");

    }

    //Execute the insert statement
    pConn->Execute(commandStr.c_str(), NULL,adExecuteNoRecords);
    pConn->Close();
}
catch(_com_error &ce)
{
    printf("Error:%s\n",ce.ErrorMessage());
    pConn->Close();
}
}

Всякий раз, когда я запускаю это, получаю ошибку.Затем я изменил char tempbuf[50]; на std::string str1;.
Теперь он показывает:

Error C2664: 'sprintf' : cannot convert parameter 1 from 'std::string' to 'char *;

Переменная количества содержит значение с плавающей точкой.Как я могу скопировать значение с плавающей точкой, присвоить его строковой переменной?

Ответы [ 4 ]

5 голосов
/ 27 декабря 2011

Вы смешиваете C ++ со стандартными функциями библиотеки C.

Вы должны использовать примитивы C ++.См. StringStreams

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

int main () {
  std::stringstream ss;
  ss << "hello world";
  ss << 45;
  ss << std::endl;
  std::string foo = ss.str();
  std::cout << foo;
  return 0;
}

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

Если вы хотите ту же логику в C: тип std :: string не является типом C, стандартный тип строкидля C это char * и const char * для неизменяемых строк.

Функции, которые вы хотите посмотреть, следующие: strncat (объединенные строки) и более безопасный snprintf.

2 голосов
/ 27 декабря 2011

sprintf нужен символ *, но не std :: string

int sprintf ( char * str, const char * format, ... );

вместо этого вы можете использовать ostringstream

ostringstream oss1;
oss1 << (analysis->peak + j)->amount;
oss1.str();
2 голосов
/ 27 декабря 2011

Используйте std::stringstream (необходимо указать <sstream>):

float amount = 3.14159;
std::stringstream ss;

ss << amount;

std::string tempbuf = ss.str();
1 голос
/ 27 декабря 2011

Вы не должны использовать sprintf для строки stl, вместо этого используйте ostringstream:

#include <sstream>
#include <string>
#include <iostream>
using namespace std;

/// ...

ostringstream strstr;
strstr << (analysis->peak + j)->amount;
str += str.str()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...