【问题标题】:Error C2664: 'sprintf' : cannot convert parameter 1 from 'std::string' to 'char *'错误 C2664:“sprintf”:无法将参数 1 从“std::string”转换为“char *”
【发布时间】:2011-12-27 10:14:53
【问题描述】:

下面是VC++中的插入函数。 当我将 char 更改为 string 数据类型以读取以下代码中的 amount 变量的值时,出现此错误。

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

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

【问题讨论】:

  • 为什么是c标签? :: 是 C 中的语法错误,stringtry 是普通标识符!删除了 C 标记。

标签: visual-c++


【解决方案1】:

您将 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

【讨论】:

  • 嗨,Alex,感谢您的回复...我实际上想要 C 中的相同逻辑而不是 C++。我正在使用 vsiual studio VC++ 编译器来运行应用程序。Char 是 VC++ 唯一识别的.so 我尝试将其声明为 char* str;但它显示未标记的标识符。因此在 VC++ 字符串中进行了检查。
  • 这里我的程序是 C.char* str; const char* commandstr="插入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);// 这里它在运行代码时显示错误 Error:Run-Time Check Failure #3 - 变量 'str' 正在使用而没有被初始化相同的初始代码。
  • 那是因为 char * 是一个指向 char 的指针。并且您需要在堆上分配内存才能使其正常工作。或者您使用堆栈分配的缓冲区,例如 #define BUFFER_SIZE 256 char str[BUFFER_SIZE];
【解决方案2】:

使用std::stringstream(您需要包含&lt;sstream&gt;):

float amount = 3.14159;
std::stringstream ss;

ss << amount;

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

【讨论】:

  • 感谢您的回复...当我单独运行此程序时它工作正常。但我想在 C..actaully 中实现它。我的应用程序是 C 而不是 C++.am 使用 VC++ 编译器来运行程序。我使用 char* str 而不是 std::string.it 显示未声明的 char* 标识符str;
【解决方案3】:

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

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

你可以改用ostringstream

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

【讨论】:

    【解决方案4】:

    你不应该对 stl 字符串使用 sprintf,而是使用 ostringstream:

    #include <sstream>
    #include <string>
    #include <iostream>
    using namespace std;
    
    /// ...
    
    ostringstream strstr;
    strstr << (analysis->peak + j)->amount;
    str += str.str()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多