2015-11-07 160 views
0

當我將用戶輸入存儲在變量中並輸出時,它對於我的peoples()函數給出值0。在C++中始終輸出爲0的變量的輸入值

#include <iostream> 
using namespace std; 

int number1, number2, result; 
// My result should like this 
void addison() 
{ 
    cout << "Enter first number:"; 
    cin >> number1; 
    cout << "Enter second number:"; 
    cin >> number2; 
    result = number1 + number2; 
    cout << number1 << "+" << number2 << "= " << result << endl; 
} 

int name, age; 
// This is the problem and always giving value of variable as 0 after inputting value. 
void peoples() 
{ 
    cout <<"Enter your name:"; 
    cin >> name; 
    cout <<"Enter your age:"; 
    cin >> age; 
    cout << "Your name is: " << name << " Your age is: " << age << endl; 
} 

int main() 
{ 
    int input; 

    cout<<"People: 1 \n"; 
    cout<<"People: 2 \n"; 
    cout<<"People: 3 \n"; 
    cin>>input; 

    switch (input){ 

     case 1: 
      peoples(); 
      break; 
     case 2: 
      addison(); 
      break; 
     case 3: 
      cout<<"This is people 3"; 
      break; 
     default: 
      cout<<"You have entered Invalid Value"; 
      break; 
    } 

    cin.ignore(); 
    cin.get(); 
} 

如果有的話你不明白只是評論此事。

+0

請在此處發佈代碼,輸入,期望輸出和觀測輸出。 –

+0

我的猜測是你輸入'name'作爲'string',雖然它被定義爲'int' –

+0

謝謝@Alex Lop –

回答

1

將「name」變量轉換爲字符串而不是int。

+0

非常感謝! –

0

發生此問題的原因是您已將name定義爲int,因爲它應該是string。改變nameage的定義,像這樣:

string name; //This should be string 
int age; //This could be a string too, if you want 

void peoples() 
{ 
    cout <<"Enter your name:"; 
    cin >> name; 
    cout <<"Enter your age:"; 
    cin >> age; 
    cout << "Your name is: " << name << " Your age is: " << age << endl; 
} 
+0

請不要回答代碼通過鏈接提供給其他網站的問題。如果這個鏈接被破壞,你的回答根本就沒有任何意義。 –

+0

好的,謝謝你的建議,但我確實試圖現在添加代碼,但是我不能這麼做..總會有錯誤信息。 –

1
int name, age; 
// This is the problem and always giving value of variable as 0 after inputting value. 
void peoples() 
{ 
    cout <<"Enter your name:"; 
    cin >> name; 

這裏的麻煩就來了。 nameint,這沒有意義。它應該是std::string

當用戶輸入一些東西,不能被解析爲一個整數,並嘗試將其解壓縮到一個intstd::cin設置爲錯誤狀態。另外,根據您使用的是哪個版本的C++,會發生以下情況:

  • 在C++ 11之前,根本沒有修改name
  • 由於C++ 11,name被設置爲0

參見http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt

如果提取失敗(例如如果輸入了字母,其中數字是 預期),值是保留未修改且失敗位置。 (直到C++ 11)

如果提取失敗,則將零寫入值並設置失敗位。 (...)(因爲C++ 11)

讓我們來看看這是什麼意思爲您的代碼的其餘部分:

cout <<"Enter your age:"; 
    cin >> age; 

由於std::cin仍然是一個錯誤狀態,沒有輸入發生。 age要麼未被修改(在C++ 11之前),要麼被設置爲0(自C++ 11以來)。

cout << "Your name is: " << name << " Your age is: " << age << endl; 

之前C++ 11,這將導致未定義行爲因爲你永遠不初始化nameage,並試圖將它們打印之前沒有任何分配意味着任何事情都有可能發生。在今天的實踐中,你只會「打印」看似隨機的值,但理論上,你的程序也可能會崩潰或做其他所有奇怪的事情。

由於C++ 11,你必須至少保證了std::cin提取運營商設置的變量爲0,所以沒有更多的不確定的行爲在這裏。這可以說是更好,因爲你立即注意到有什麼不對。


在這兩種情況下,解決的辦法是不使用operator>>直接當你正在處理的人力投入。當您給他們一個鍵盤並要求他們輸入某些內容時,已知人類用戶會犯錯誤。

改爲使用std::getline函數。它將一個整行輸入到std::string對象中。對於name,如果您按照之前的建議進行操作並將變量轉換爲std::string,則已經足夠好了。它甚至會允許名稱中包含空格,比如「電腦愛好者」。

對於age,使用C++ 11 std::stoi函數將輸入轉換爲int和處理與相應錯誤輸入錯誤,通過捕捉其可以被拋出的異常。

下面是一個簡單的例子,讓你開始:

int name; 
std::string age; 

void peoples() 
{ 
    std::cout <<"Enter your name:"; 
    std::getline(std::cin, name); 

    std::cout <<"Enter your age:"; 
    std::string age_as_string; 
    std::getline(std::cin, age_as_string); 
    try 
    { 
     age = std::stoi(age_as_string); 
     std::cout << "Your name is: " << name << " Your age is: " << age << "\n"; 
    } 
    catch (std::exception const&) 
    { 
     // do something meaningful if the user entered 
     // something bad, e.g. "xxx" 
    } 
} 

當你得到這個工作,下一步將是放棄全局變量。它們與封裝和結構化編程完全相反。

+0

只是感謝您瞭解有關此代碼的全部細節! –

+0

@ComputerLover:不客氣。 (我認爲)的一點是,如果您只是使用諸如'std:string'或'std :: stoi'之類的所有便利,C++可以非常易於使用。當您必須處理流錯誤狀態或類似事情的複雜性時,這通常表示您的代碼不使用正確的工具。 –

+0

再次感謝你,我想告訴你的另一件事是,當我使用名稱在鍵盤上輸入值。在那個時候,我不能使用全名我的意思是如果我只使用我的值名稱之間的空格,那麼它不能正常工作。那我該如何處理呢?我的意思是你回答了,但我需要以正常的方式工作,這是可能的嗎? –