2015-11-06 160 views
0

我決定學習C++,它具有相當有限的以前的編程知識。我目前正在關注本書跳過C++作者:Alex Allain。我已經打了一章指針和爲我出現以下問題的實踐問題的一部分:C++ - 函數,參數和指針 - 訪問衝突

  1. 寫,提示用戶輸入的功能他或她的姓和名,兩個獨立的值。此函數應通過傳遞給函數的附加指針(或引用)參數將這兩個值返回給調用者。嘗試先用指針和引用來做這件事。

這是我寫的代碼:

#include <iostream> 

void getDetails(char * n, char * s) 
{ 
    std::cout << "Input name: "; 
    std::cin >> *n; 

    std::cout << "\n"; 

    std::cout << "Input surname: "; 
    std::cin >> *s; 
} 

int main() 
{ 
    char *name = NULL; 
    char *surname = NULL; 

    getDetails(name, surname); 

    std::cout << "Name: " << *name << "\n"; 
    std::cout << "Surname: " << *surname << "\n"; 

    return 0; 
} 

我一直運行到訪問衝突錯誤,我完全不知道爲什麼。

  1. 我在做什麼錯?
  2. 爲什麼它錯了?
+0

通過就像一個指針接收輸入是危險的,因爲用戶可以輸入更多的文字比你有空間(在這種情況下實際上沒有空間)。您應該使用可以檢查輸入量的方法,或者使用'std :: string',這樣更簡單,更安全。 –

回答

8

其實你有兩個問題:

  1. 你是不是爲namesurname保留內存(這就是爲什麼你的訪問衝突錯誤)
  2. 您正在閱讀從cin一個字符(因爲你正在引用一個char*這將導致一個sigle字符)

您可以解決這兩個問題,只需使用0123的char*

2

除了而不是 MrMarley托馬斯Sparber的答案*,你可能會發現在std::getline功能的一些利益上的空間std::istream::operator>>的休息時間和用戶名可以包含一個。

(*)還沒有評論呢。

+0

MrMarley是你的意思嗎?我看到很多人拼錯我的姓氏,但這是最有趣的! :-) - > +1 –

+0

OOps ...我讀了原始海報的名字而不是你的:) – YSC

0

您沒有在要存儲名稱和姓氏的地方分配內存。 你的指針是空指針。

char *name = NULL; 
char *surname = NULL; 

所以程序有未定義的行爲。

另外我覺得作者是指使用類型std::string

在這種情況下對象的程序可以像

#include <iostream> 
#include <string> 

void getDetails(std::string *n, std::string *s) 
{ 
    std::cout << "Input name: "; 
    std::cin >> *n; 

    std::cout << "\n"; 

    std::cout << "Input surname: "; 
    std::cin >> *s; 
} 

void getDetails(std::string &n, std::string &s) 
{ 
    std::cout << "Input name: "; 
    std::cin >> n; 

    std::cout << "\n"; 

    std::cout << "Input surname: "; 
    std::cin >> s; 
} 

int main() 
{ 
    std::string name; 
    std::string surname; 

    getDetails(&name, &surname); 

    std::cout << "Name: " << name << "\n"; 
    std::cout << "Surname: " << surname << "\n"; 

    std::cout << "\nAnd one more" << "\n"; 

    getDetails(name, surname); 

    std::cout << "Name: " << name << "\n"; 
    std::cout << "Surname: " << surname << "\n"; 

    return 0; 
}