C ++ строки и указатели - PullRequest
       2

C ++ строки и указатели

12 голосов
/ 04 марта 2012

Я изучаю 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».

Может кто-нибудь предложить решение этой проблемы, все еще используя указатели и строки вместо массивов символов (которые я уже выяснилкак сделать)?

Ответы [ 7 ]

15 голосов
/ 04 марта 2012

Это потому, что вы не выделяете ваших объектов до их использования:

string * firstName = new string();
//...
delete firstName;

Стоит добавить, что использование указателей в этой ситуации, ну, в общем, бессмысленно: строковые объектыстандартная библиотека C ++ выделяет данные для строки из кучи;строки в любом случае обычно не намного больше пары указателей.

3 голосов
/ 04 марта 2012

Я думаю, вы не хотите использовать 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 голосов
/ 04 марта 2012

Вы получаете ошибки, потому что вы используете строки в качестве указателей, а не инициализируете их.Правильный способ сделать это:

#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;
}

Вы можете использовать указатели на строки, но они предназначены для использования в качестве локального объекта и передачи в качестве ссылок (или константных ссылок, если вы хотите).

2 голосов
/ 04 марта 2012

Это будет выглядеть так:

int main()
{
    std::string* s = new std::string;
    std::getline(std::cin, *s);
    std::cout << *s;
    delete s;
}

Но на самом деле нет причин для этого, просто определите в стеке обычную строковую переменную.

1 голос
/ 04 марта 2012

Нарушение доступа связано с тем, что вы разыменовываете нулевой указатель.

Здесь установлен нулевой указатель

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;
}
0 голосов
/ 04 марта 2012

Прочитайте 10 заповедей программирования c .Некоторые из них более или менее устарели для современных разработчиков, но некоторые все еще важны, например, второй:

Ты не должен следовать указателю NULL, потому что хаос и безумие ждут тебя в конце.1006 *

Это на самом деле то, что вы здесь делаете.Ваши указатели никуда не указывают (см. Присваивания для 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
0 голосов
/ 04 марта 2012

Поскольку вы используете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...