2014-10-08 24 views
1

首先,请看下面的简单代码。在C++中读取c样式字符串时出错

int main(){ 
    char *name; 
    cout << "Enter your name: "; 
    cin >> name; 
    cout << "Your name is: " << name; 

    return 0; 
} 

上述代码给我一个错误warning: deprecated conversion from string constant to 'char*'
但我已经被解决了这个问题:

const char *name; 

编译代码后,我有另一个错误no match for 'operator>>' (operand types are 'std::istream {aka std::basic_istream<char>}' and 'const char*')

以前错误的原因是什么,以及如何解决它?

+3

'的char *'不分配任何存储的字符串进去你应该使用'的std :: string名;'来代替。 – 2014-10-08 00:43:05

+0

这两个版本(有和没有'const')都有部分相同的,部分不同的问题。但是,因为你标记了'C++'这个问题:为什么不使用std :: string来完全避免内存/指针问题呢? – Oguk 2014-10-08 00:44:23

+0

您不会从该代码中获得该警告。我猜它实际上就是'char * name =“something”;'。无论如何,你不能写入字符串常量或未初始化的指针,所以使用'std :: string'。 – 2014-10-08 00:46:29

回答

5

您尚未初始化任何可以读取字符串的内存。 char *是指向内存中的位置的指针,其中字符串可以读取,但首先必须使用newmalloc分配内存。

然而,在C++中,还有另一种更好的选择:使用std::string

#include <string> 

int main() 
{ 
    std::string name; 
    cout << "Enter your name: "; 
    cin >> name; 
    cout << "Your name is: " << name; 

    return 0; 
} 

如果您在使用c字符串设定,你可以做分配内存,并做类似如下:

int main() 
{ 
    char name[MAX_SIZE]; 
    cout << "Enter your name: "; 
    cin.get(name, MAX_SIZE); 
    cout << "Your name is: " << name; 

    return 0; 
} 

(感谢尼尔·柯克的改进)

+0

我不在乎使用'c'或'C++',难道没有办法使用c-string吗? – Ninja 2014-10-08 00:46:37

+1

@Sunrise是的,但你为什么要? – 2014-10-08 00:47:22

+0

@孙瑞:是的,但它更复杂,更容易出错。你为什么想要? – 2014-10-08 00:47:28