【问题标题】:User Input as Argument C++用户输入作为参数 C++
【发布时间】:2018-09-26 14:51:24
【问题描述】:

我是编码新手,想知道为什么我的代码没有按照我的预期运行。我将代码构建为一个培训计划,以帮助我练习所学的知识。当我注释掉第 19 - 23 行(多行注释部分)时,代码似乎可以正常工作,但当我没有注释时,它开始出现意外行为。

#include <iostream>

int askUserNumber ()
{
    std::cout << "Please input a number: " << std::endl;  //ask user to input number
    int userNumber;                                       //define integer to store input
    std::cin >> userNumber;                               // get input from user

    return (userNumber);                                  // return input to caller
}

void printUserNumber (int userNumber)
{
    std::cout << "Your number input was: " << userNumber << std::endl; //print input to user screen
}

int main ()
{
    /*
    std::cout << "Please input your name: " << std::endl;      // ask user name
    int userName;                                         // variable to store user name
    std::cin >> userName;                                 // get user name
    */

    printUserNumber(askUserNumber());                       // call to askUserNumber to get user input to print to screen
    return(0);
}

结果(未注释掉代码):

请输入您的姓名:
科里
请输入一个数字:
您输入的号码是:“someGarbageNumber”

它不允许我在该部分输入数字,它只是打印出一个随机数。

结果(注释掉代码):

请输入一个数字:
7
您输入的数字是:7

这次运行完美,没有任何问题。我不明白为什么当 printUserNumber(askUserNumber()) 的函数调用达到打印“请输入一个数字:”和不允许我输入一个。感谢您的任何回复。我希望我以良好的格式写了我的问题,并以清晰直接的方式解释了我的问题。希望结果部分也将允许一些清晰度。期待解决方案再次感谢。

【问题讨论】:

  • userNumber 是一个int。您不能将文本字符串存储在 int 中("Corey" 不是 int)。当您获得下一个输入时,文本仍在输入缓冲区中,但仍无法读取为int
  • 当提示您输入您的姓名时,您是否真的输入了您的姓名?这行不通,因为您正试图将其读入int 变量int userName。只有可解析为 int 的“名称”才有效。
  • 将非数字字符串读入int 失败,因此int 保持未初始化状态(即包含垃圾)。

标签: c++ parameter-passing user-input


【解决方案1】:

因为userNameint 并且您正尝试使用std::cin 将非数字字符序列读入其中,所以操作失败并将std::cin 留在fail()ed state 中,因此没有以下operator&gt;&gt;std::cin 的调用将成功提取更多输入字符。

它不允许我在该部分输入数字,它只是打印出一个 随机数。

在 C++11 之前,行为是保持 rhs 未修改,在您的情况下是未初始化的int,因此您在打印时会看到垃圾。

你可以在std::basic_istream::operator&gt;&gt;()的引用中看到所有这些:

  • 如果提取失败(例如,如果在需要数字的地方输入了字母), value 保持不变,failbit 已设置。 (直到 C++11)
  • 如果提取失败,则将零写入值并设置failbit。如果提取导致值太大或太小而无法放入value,则写入std::numeric_limits&lt;T&gt;::max()std::numeric_limits&lt;T&gt;::min() 并设置failbit 标志。 (C++11 起)

您仍然可以通过清除其错误状态标志并忽略缓冲区中的内容来从流中的此类 fail() 状态恢复:

int main()
{
    std::cout << "Please input your name: " << std::endl; // ask user name
    int userName;                                         // variable to store user name
    std::cin >> userName;                                 // get user name

    if (!std::cin) // Check if `fail()`
    {
        std::cout << "input stream failure :-(" << '\n';

        // Clearing flags and input buffer
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    else
    {
        std::cout << "Your name input was: " << userName << '\n';
    }

    printUserNumber(askUserNumber());                       // call to askUserNumber to get user input to print to screen

    return 0;
}

输出:

Please input your name: 
input stream failure :-(
Please input a number: 
Your number input was: 7

获得所需行为的解决方案是简单地将userName 设为std::string。在这种情况下the above code produces the output:

Please input your name: 
Your name input was: Corey
Please input a number: 
Your number input was: 7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2017-08-13
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    相关资源
    最近更新 更多