2011-12-27 82 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 *; 

量变量包含浮点值。 如何复制浮点值将其赋值给字符串变量?

+2

为什么c标签? '::'是C,'string'和'try'中的语法错误,是普通标识符! C标签被删除。 – pmg 2011-12-27 11:22:15

回答

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

编辑:

如果你想在C相同的逻辑:该类型的std :: string是不是C型,C的标准字符串类型是不可改变的字符串char *const char *

然后,您要查看的功能是:strncat(连接字符串)和更安全的snprintf

+0

嗨亚历克斯,感谢您的答复...我想在C中的相同的逻辑实际上不是在C++中。我使用vsiual工作室VC++编译器来运行应用程序.Char是唯一的VC++ recognition.so我试图宣布它为char * str;但它显示undecaled标识符。所以检查在VC++字符串。 – hari 2011-12-27 11:11:23

+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“,(analysis-> peak + j) - > amount); //在运行代码时显示错误 错误:运行时检查失败#3 - 正在使用变量'str'而未被初始化 相同的初始代码 – hari 2011-12-27 12:17:16

+0

这是因为char *是一个指向char的指针,并且您需要在堆上分配内存才能工作,或者您使用堆栈分配的缓冲区,如#define BUFFER_SIZE 256 char str [BUFFER_SIZE]; – Alex 2011-12-27 16:30:01

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 2011-12-27 11:14:41

1

你不应该用sprintf的STL字符串,使用ostringstream代替:

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

/// ... 

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

的sprintf需要的char *但不是的std :: string

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

你可以使用ostringstream instea d

ostringstream oss1; 
oss1 << (analysis->peak + j)->amount; 
oss1.str(); 
相关问题