2015-11-07 163 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

再次感谢你,我想告诉你的另一件事是,当我使用名称在键盘上输入值。在那个时候,我不能使用全名我的意思是如果我只使用我的值名称之间的空格,那么它不能正常工作。那我该如何处理呢?我的意思是你回答了,但我需要以正常的方式工作,这是可能的吗? –