2012-03-04 93 views
8

Tôi đang học C++ và hiện tại tôi đang làm việc với chuỗi và con trỏ.Chuỗi và con trỏ C++

Tôi đang theo một cuốn sách tập thể dục và cho một trong những câu hỏi tôi đã tạo ra những điều sau đây:

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

Trong một nỗ lực để sử dụng nhiều của con trỏ tôi đã cố gắng để kết hợp nó cùng với chuỗi và đã làm cho giải pháp phức tạp hơn vì lý do này. Khi tôi chạy điều này, tôi nhận được một "Ngoại lệ không đúng: Truy cập vi phạm vị trí đọc xxxxxxxxx".

Ai đó có thể đề xuất giải pháp cho điều này bằng cách sử dụng con trỏ và chuỗi thay vì mảng char (mà tôi đã tìm ra cách thực hiện)?

+3

Bạn không phân bổ chuỗi và sau đó bạn chuyển con trỏ rỗng tới hàm 'getline()' ... chỉ cần thay đổi tất cả 'chuỗi * x = nullptr; ' để 'string x;' hoặc phân bổ các chuỗi như bạn làm với 'displayName' trước khi bạn chuyển chúng đến' getline() ' – Yaniro

+1

Nếu bạn mới bắt đầu" học C++ ", bạn không nên đi bất cứ đâu gần con trỏ thô. Chúng là một phần khó, tiên tiến, thích hợp của C++ mà bạn không cần cho hầu hết các hoạt động lập trình "bình thường". –

+0

[Đoạn video] này (http://www.youtube.com/watch?v=i49_SNt4yfk) luôn rất truyền cảm hứng khi tôi bị nhầm lẫn về con trỏ ;-) –

Trả lời

12

Điều này là do bạn chưa phân bổ đối tượng của bạn trước khi sử dụng chúng:

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

Nó có giá trị bổ sung thêm rằng việc sử dụng con trỏ trong tình huống này là, tốt, vô nghĩa: đối tượng chuỗi trong tiêu chuẩn C++ thư viện phân bổ dữ liệu cho chuỗi từ heap; các chuỗi thường không nhiều hơn một cặp con trỏ.

+4

hahaha vô nghĩa: ') – Rishi

2

Nó sẽ trông như thế này:

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

Nhưng có thực sự là không có lý do để làm như vậy, chỉ cần xác định một chuỗi biến bình thường trên stack.

0

Vì bạn đang sử dụng nullptr, tôi đoán một C++ 11 giải pháp toàn diện cũng không kém phần tinh:

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

Tất nhiên sử dụng nullptr là không phải những gì bạn muốn: bạn cần phải phân bổ các nguồn lực bạn muốn sử dụng.

Lưu ý rằng việc sử dụng con trỏ trong những trường hợp đơn giản này là tự chụp chân, cả cú pháp và khôn ngoan.

EDIT tôi sửa chữa các mã (một ngoặc quên và * trên dòng cuối cùng của main), nó succesfuly biên dịch và chạy trên GCC 4.7.

+0

Cảm ơn vì điều đó. Tôi vẫn nhận được lỗi ngoại lệ unhandled từ tập tin xstring. Bạn có nghĩ rằng studio trực quan đang gặp sự cố không? Tôi đánh giá cao tôi không nên làm điều này, tôi sẽ chỉ cần đi bộ từ nó và dính vào những điều cơ bản của việc sử dụng chuỗi. – Dan

+0

@Đã sửa mã. – rubenvb

2

Tôi nghĩ, bạn không muốn sử dụng pointers chút nào. Bạn có thể làm việc với strings mà không có con trỏ.

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

Othewise, nếu bạn cần gợi ý, bạn phải cấp phát bộ nhớ cho các biến:

cout << "Enter your first name: " << endl; 
    firstName = new string(); 
    getline(cin,*firstName); 

... và kết quả in với toán tử tham chiếu (*):

cout << "Here's the information in a single string: " << *displayName; 
0

đọc số 10 commandments of c programming. Một số ít hoặc nhiều lỗi thời cho các nhà phát triển ngày nay, nhưng một số vẫn còn quan trọng, chẳng hạn như số thứ hai:

Bạn đừng theo con trỏ NULL, vì sự hỗn loạn và điên rồ đang chờ bạn ở cuối.

Đó thực sự là những gì bạn đang làm ở đây. Con trỏ của bạn trỏ đến hư không (xem các bài tập cho std::nullptr).

Để sửa lỗi này, bạn phải chỉ định đối tượng mới của lớp/cấu trúc đúng cho con trỏ. Ngoài ra, đừng quên xóa nó sau này:

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 
2

Bạn đang gặp lỗi vì bạn đang sử dụng chuỗi làm con trỏ và bạn không khởi tạo chúng. Một cách chính xác để làm điều này sẽ là:

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

Bạn thực sự có thể sử dụng các con trỏ tới chuỗi, nhưng họ có nghĩa là để được sử dụng như đối tượng địa phương và thông qua xung quanh như tài liệu tham khảo (hoặc tham chiếu const, nếu bạn muốn).

1

Vi phạm quyền truy cập là vì bạn là một cuộc hội thảo có con trỏ rỗng.

con trỏ Null được thiết lập ở đây

string * firstName=nullptr; 

và sau đó dereferenced đây

getline(cin,*firstName) 

Bạn cần có firstname 'điểm' một cái gì đó (một chuỗi trong trường hợp này). Đây là phiên bản đã sửa đổi mà không có ngoại lệ.

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

Xin chào, Điều này vẫn mang lại cho tôi một ngoại lệ không được giải quyết. Tôi tắt bản thân mình khỏi phương pháp này và sẽ dính vào con đường dễ dàng. Cảm ơn – Dan

+0

Chỉ cần tìm ra đó là tôi đã gây ra lỗi sau khi tôi cố định chương trình teh. Nhiều đánh giá cao sự giúp đỡ. – Dan