我正在学习C ++,目前我正在使用字符串和指针。
我正在阅读练习册,并且我已经创建了以下一个问题:
#include <iostream>
#include <string>
using namespace std;
int main(void){
string * firstName=nullptr;
string * lastName=nullptr;
string * displayName=nullptr;
cout << "Enter your first name: " << endl;
getline(cin,*firstName);
cout << "Enter your last name: " << endl;
getline(cin,*lastName);
displayName=new string;
*displayName= *lastName + ", " + *firstName;
cout << "Here's the information in a single string: " << displayName;
cin.get();
return 0;
}
为了使用更多的指针,我试图将它们与字符串混合在一起,并因此而使解决方案变得更加复杂。当我运行这个时,我得到一个“未处理的异常:访问冲突读取位置xxxxxxxxx”。
有人可以通过仍然使用指针和字符串而不是char数组(我已经知道如何做)来建议解决方案吗?
答案 0 :(得分:15)
这是因为您在使用对象之前没有分配:
string * firstName = new string();
//...
delete firstName;
值得补充的是,在这种情况下使用指针是没有意义的:标准C ++库中的字符串对象从堆中分配字符串的数据;无论如何,字符串通常不会超过一对指针。
答案 1 :(得分:3)
我想,您根本不想使用pointers
。您可以在没有指针的情况下使用strings
。
#include <iostream>
#include <string>
using namespace std;
int main(void){
string firstName;
string lastName;
string displayName;
cout << "Enter your first name: " << endl;
getline(cin,firstName);
cout << "Enter your last name: " << endl;
getline(cin,lastName);
displayName= lastName + ", " + firstName;
cout << "Here's the information in a single string: " << displayName;
cin.get();
return 0;
}
其他,如果你需要指针,你必须为变量分配内存:
cout << "Enter your first name: " << endl;
firstName = new string();
getline(cin,*firstName);
...并使用解除引用运算符(*
)打印结果:
cout << "Here's the information in a single string: " << *displayName;
答案 2 :(得分:2)
看起来像这样:
int main()
{
std::string* s = new std::string;
std::getline(std::cin, *s);
std::cout << *s;
delete s;
}
但实际上没有理由这样做,只需在堆栈上定义一个普通的字符串变量。
答案 3 :(得分:2)
您收到错误是因为您使用字符串作为指针并且您没有初始化它们。这样做的正确方法是:
#include <iostream>
#include <string>
using namespace std;
int main(void){
string firstName;
string lastName;
string displayName;
cout << "Enter your first name: " << endl;
cin >> firstName;
cout << "Enter your last name: " << endl;
cin >> lastName;
displayName = firstname + ' ' + lastName;
cout << "Here's the information in a single string: " << displayName << endl;
return 0;
}
您实际上可能会使用指向字符串的指针,但它们应该用作本地对象并作为引用传递(或者如果您愿意,则传递给const引用)。
答案 4 :(得分:1)
访问冲突是因为您要取消引用空指针。
此处设置空指针
string * firstName=nullptr;
然后在这里取消引用
getline(cin,*firstName)
你需要有一个名字'指向'某事(在这种情况下是一个字符串)。 这是一个没有例外的修改版本。
int main(void){
string * firstName= new string();
string * lastName=new string();
string * displayName=new string();
cout << "Enter your first name: " << endl;
getline(cin,*firstName);
cout << "Enter your last name: " << endl;
getline(cin,*lastName);
//displayName=new string;
*displayName= *lastName + ", " + *firstName;
cout << "Here's the information in a single string: " << displayName->c_str();
cin.get();
return 0;
}
答案 5 :(得分:0)
由于你正在使用nullptr
,我想一个成熟的C ++ 11解决方案同样没问题:
#include <iostream>
#include <memory>
#include <string>
using namespace std;
int main(void){
unique_ptr<string> firstName(new string());
unique_ptr<string> lastName(new string());
unique_ptr<string> displayName(new string());
cout << "Enter your first name: " << endl;
getline(cin,*firstName);
cout << "Enter your last name: " << endl;
getline(cin,*lastName);
*displayName= *lastName + ", " + *firstName;
cout << "Here's the information in a single string: " << *displayName;
}
当然使用nullptr
并不是您想要的:您需要分配您想要使用的资源。
请注意,在这些简单的情况下使用指针会让你自己陷入困境,无论是语法还是错误。
编辑我更正了代码(遗忘的括号和*
最后一行的main
),它成功编译并在GCC 4.7上运行。
答案 6 :(得分:0)
阅读10 commandments of c programming。对于今天的开发者来说,有些或多或少已经过时,但有些仍然很重要,例如第二个:
你不应该遵循NULL指针,因为混乱和疯狂等待着你。
这实际上就是你在这里做的事情。你的指针无处可寻(见std::nullptr
的作业)。
要纠正此问题,您必须将正确的类/结构的新对象分配给指针。另外,不要忘记稍后删除它:
std::string *myString = new std::string(); // create an object and assign it's address to the pointer
// do something with it... (this part has been right)
delete myString; // free the memory used by the object