2011-12-27 3 views
0

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

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 *; 

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

+2

почему c tag? '::' - синтаксическая ошибка в C, 'string', а' try' - обычные идентификаторы! C. – pmg

ответ

4

Вы смешиваете 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; 
} 

EDIT:

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

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

+0

Привет, Алекс, спасибо за ответ ... Я хочу, чтобы та же логика в C не была на C++. Я использую vsiual studio VC++ компилятор для запуска приложения.Char - это единственное, что распознал VC++. Так я пробовал объявить его как char * str; но он показывает незафиксированный идентификатор. Проверяется в строке VC++. – hari

+0

Здесь моя программа находится в C. char * str; const char * commandstr = "insert into table1 (unitid, g_time_dte_1, h_1, n_1, ch_1, co_1, im_1, ve_1, er_1) Значения (123, '" + strGdt + "',"; sprintf (str, " % d ", (анализ-> пик + j) -> сумма); // здесь отображается ошибка при запуске кода Ошибка: ошибка проверки времени выполнения # 3 - переменная 'str' используется без инициализации такой же Начальный код – hari

+0

, потому что char * является указателем на char, и вам нужно выделить память в куче, чтобы это работало, или вы используете стековые распределенные буферы, такие как #define BUFFER_SIZE 256 char str [BUFFER_SIZE]; – Alex

1

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

float amount = 3.14159; 
std::stringstream ss; 

ss << amount; 

std::string tempbuf = ss.str(); 
+0

спасибо за ответ ур ... он отлично работает, когда я запускаю эту программу самостоятельно, но я хочу реализовать ее в C..actaully мое приложение было в C не C++.я использую компилятор VC++ для запуска программы. Я стараюсь использовать char * str вместо std :: string.it, показывающий необъявленный идентификатор для char * str; – hari

1

вы не должны использовать Sprintf для СТЛ строки, используйте ostringstream вместо:

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

/// ... 

ostringstream strstr; 
strstr << (analysis->peak + j)->amount; 
str += str.str() 
1

Sprintf нужен символ *, но не StD :: строка

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

вы можете использовать ostringstream instea d

ostringstream oss1; 
oss1 << (analysis->peak + j)->amount; 
oss1.str();