C ++字符串和指针

时间:2012-03-04 12:21:18

标签: c++ string pointers

我正在学习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数组(我已经知道如何做)来建议解决方案吗?

7 个答案:

答案 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