2014-09-13 100 views
0

这是正确的还是有更好的方法来做到这一点。
Visual Studio给出错误说'strcpy()折旧'。在C++中输入字符串到动态分配的char内存中

using namespace std; 
char* ptr; 
ptr=(char *)calloc(1,sizeof(char)); 
cout << "Input the equation." << endl; 
string eqn; 
getline(cin, eqn); 
ptr = (char *)realloc(ptr, top + eqn.size()+1); 
strcpy(ptr, eqn.c_str()); 

P.S.我想ptr是输入方程的确切大小。

+3

为什么地球上您使用的C字符串,C++代码中的'strcpy'和'malloc'?为自己节省很多痛苦,并使用'std :: string'。 – 2014-09-13 16:10:19

+1

折旧?显然微软讨厌它...... – texasbruce 2014-09-13 16:19:40

+2

你已经在你的代码中使用了'std :: string'。你为什么还使用'char *''calloc'和'realloc'?是否因为你认为你需要使用它们是因为一个函数需要传递一个'char *'? – PaulMcKenzie 2014-09-13 16:20:58

回答

1

假设你试图实现的是创建一个modifiable字符缓冲区,给定std::string,最好的选择是使用std::vector<char>来创建这样一个缓冲区。

#include <vector> 
#include <string> 
#include <iostream> 
//... 
void foo(char *x) 
{ 
    // do something to 'x' 
} 

using namespace std; 

int main() 
{ 
    cout << "Input the equation." << endl; 
    string eqn; 
    getline(cin, eqn); 

    // construct vector with string 
    std::vector<char> ptr(eqn.begin(), eqn.end()); 

    // add null terminator 
    ptr.push_back(0); 

    foo(&ptr[0]); 
} 

上面创建一个修改的,空终止通过利用std::vector称为ptr C-字符串。请注意,有没有来电malloccalloc

+0

对于C++ 11,你有'foo(ptr.data());' – 2014-09-13 16:56:27

+0

有没有办法不使用'eqn',而是直接输入'ptr'。就像我们初始化一个动态内存时,它会是'char * ptr; ptr = new char [size]'。这里我不知道'尺寸'。我希望'ptr'占用存储'equation'和'\ 0'所需的空间。 – an23lm 2014-09-13 18:00:07

+0

@ an23lm我的建议 - 保持代码的答案。 'getline'使得它实际上不可能超越缓冲区,因为它使用'std :: string'。任何其他输入机制都要求您对代码大小进行硬编码,或编写一些模拟getline函数的神奇C++代码。 – PaulMcKenzie 2014-09-13 19:28:40

1

strcpy已弃用,因为它是缓冲区溢出问题的常见来源,通常与strncpy一起修复。话虽如此,你首先使用std::string更好,

1

如果你想与malloc字符串的副本,你可以简单地使用strdup

char* ptr = strdup(eqn.c_str()); 
// .. 
free(ptr); 
相关问题