0

我正在为学校开发一个小程序来计算输入数字的阶乘。我在 Java 方面有丰富的经验,但这是我第一次接触 C++。

我的问题:我需要能够从用户那里获得单个输入,它可以是整数或字符“q”,这表示应用程序需要退出。

这是我目前的尝试:

#include <stdio.h>
#include <iostream>
#include "Header.h"
using namespace std;

int x=0;
char y;


int main(int argc, char *argv[])
{
    printf("Hello, please enter a number to compute a factorial (or 'q' to quit): ");

    cin >> y;
    x= (y-'0');


if(y=='q')
    {   printf("Thanks for playing!\n");
        exit(1);
    }   

    long result= print_Factorial(x);
    cout << x << "!= " << result << "\n";

    return result;

}

但是,这种铸造不起作用。如果我输入一个两位数,例如 12,它只会将两者的第一个数字转换为 x 并计算该阶乘。我确定这很简单,我错过了什么?

明确的答案或导致我可以了解更多关于这个问题的地方,任何事情都值得赞赏。

4

4 回答 4

3

您可以使用一些函数尝试将字符串转换为数字,并检查转换是否成功。该std::strtol功能是其中之一:

std::string input;
std::cin >> input;

char* endptr = nullptr;
const char *input_ptr = input.c_str();
long value = std::strtol(input_ptr, &endptr, 10);

if (endptr == input_ptr)
{
    // Input was not a valid number
}
else if (*endptr != '\0')
{
    // Input starts with a valid number, but ends with some extra characters
    // (for example "123abc")
    // `value` is set to the numeric part of the string
}
else
{
    // Input was a valid number
}

如果你不介意例外,那么你可以使用 egstd::stoi代替:

std::string input;
std::cin >> input;

int value = 0;
try
{
    size_t endpos = 0;

    value = std::stoi(input, &endpos);

    if (endpos != input.length())
    {
        // Input starts with a valid number, but ends with some extra characters
        // (for example "123abc")
        // `value` is set to the numeric part of the string
    }
    else
    {
        // Input is a valid number
    }
}
catch (std::invalid_argument&)
{
    // Input not a valid number
}
catch (std::out_of_range&)
{
    // Input is a valid number, but to big to fit in an `int`
}
于 2013-08-30T04:51:56.283 回答
1

您获得第一个数字的原因是因为您使用的是 cin >> y; 其中 y 是一个字符,它包含一个字符。所以你只会得到一个角色。

您可能想要做的是将答案作为字符串获取,并且一旦您检查该字符串不是 == "q",则可以将其转换为 int。

于 2013-08-30T04:51:47.667 回答
0

您的用户可以输入任何文本行,您必须阅读“文本行”来验证。

#include <iostream>
#include <string>
#include <stdexcept>

int main()
{
    std::string text;
    std::getline(std::cin,text);

    if(text.size()==1 && text[0]=='q')
    { 
        std::cout << "quit command"; 
        return 0; 
    }

    try
    {
        int i = std::stoi(text); //may throw if text is not convertible
        /* whatever elaboration and output */
        return 0;
    }
    catch(const std::exception& e)
    {
        std::cout << "bad input: " << text << '\n';
        std::cout << "caused excpetion: " << e.what() << std::endl;
    }
    return 3; //means "excpetion thorown"
}
于 2013-08-30T08:27:50.750 回答
0
#include <iostream>
#include <sstream>

int main() {
    std::string in;
    std::cout << "Please enter a digit: ";
    while(std::cin >> in) {
        std::cout << "Input: " << in << std::endl;
        if(in.size() == 1) {
            if(in[0] == 'q' || in[0] == 'Q') {
                std::cout << "Quit" << std::endl;
                return 0;
            }
        }
        std::istringstream parse(in);
        int value;
        if(parse >> value) {
            if(parse.eof()) {
                std::cout << "Success" << std::endl;
                return 0;
            }
        }
        std::cout << "Please try again: ";
    }
    std::cerr << "This should not happen <control + d>" << std::endl;
    return 1;
}
于 2013-08-30T05:03:02.190 回答