当我们输入字符c++时如何处理输入类型整数

f2uvfpb9  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(159)

我有一个简单的表单,输入类型为int。当我输入带有字符的输入birthYearcurrentYear时,结果为0,程序在输入被填充之前结束。

char name[100], birthplace[100];
    int birthYear, currentYear, age;
    
    cout << "Name : ";
    cin.getline(name, 100);
    cout << "Birtyear : ";
    cin >> birthYear;
    cin.ignore();
    cout << "Current Year : ";
    cin >> currentYear;
    cin.ignore();
    cout << "Birthplace : ";
    cin.getline(birthplace, 100);

    age = currentYear - birthYear;
    
    cout << "=================" << endl;
    cout << "NAME : " << name << endl;
    cout << "AGE : " << age << endl;
    cout << "BIRTHPLACE : " << birthplace << endl;

我无法将birthYearcurrentYear的数据类型更改为string,因为它将被计算。
我试着将birthYearcurrentYear的数据类型转换为char,然后将其转换为int,但当我输入超过1个字符时,程序无法正常运行。
我所期望的是,当我输入字符,然后变量将设置默认值或程序显示错误消息。

v8wbuo2f

v8wbuo2f1#

当从输入流中提取整数时,如果输入无法转换为整数,operator>>会将输入流置于错误状态。您需要检查并清除此状态,然后才能继续从流中阅读。例如:

int readInt(const char *prompt) {
    int value;
    do {
        cout << prompt << " : ";
        if (cin >> value) break;
        cout << "Invalid number entered! Try again\n";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    while (true);
    cin.ignore();
    return value;
}

...

char name[100], birthplace[100];
int birthYear, currentYear, age;
    
cout << "Name : ";
cin.getline(name, 100);

birthYear = readInt("Birth Year");
currentYear = readInt("Current Year");

cout << "Birthplace : ";
cin.getline(birthplace, 100);

age = currentYear - birthYear;
    
cout << "=================" << endl;
cout << "NAME : " << name << endl;
cout << "AGE : " << age << endl;
cout << "BIRTHPLACE : " << birthplace << endl;
3ks5zfa0

3ks5zfa02#

我会使用std::from_chars(C++17起)读取字符串并将其转换为数字:

  • std::from_chars允许您检查从string到int的转换是否有任何错误(参见下面示例中的返回值ec),包括额外字符(参见返回值ptr,指向输入字符串中与int不匹配的第一个字符)。
  • 您可以将转换代码取出到函数中,并将其用于出生年份和当前年份。
  • 我建议使用std::string而不是char[100]来阅读输入字符串。
  • 我不建议混合使用std::getlinecin >>

Demo(https://godbolt.org/z/Erhqxq8Tz)

#include <charconv>  // from_chars
#include <iostream>
#include <string>  // getline
#include <system_error>  // errc

int readYear(const std::string& text) {
    std::string yearStr{};
    int year{};
    for (;;) {
        std::cout << text;
        std::getline(std::cin, yearStr);
        std::cout << yearStr << "\n";
        auto [ptr, ec] = std::from_chars(yearStr.data(), yearStr.data() + yearStr.size(), year);
        if (ec != std::errc{} or ptr != yearStr.data() + yearStr.size()) {
            std::cout << "\tError: '" << yearStr << "' is not a correct year\n";
        } else {
            break;
        }
    }
    return year;
}

int main() {
    std::cout << "Name : ";
    std::string name{};
    std::getline(std::cin, name);
    std::cout << name << "\n";
    int birthYear{ readYear("Birth Year : ") };
    std::cout << birthYear << "\n";
    int currentYear{ readYear("Current Year : ") };
    std::cout << currentYear << "\n";
    std::cout << "Birth Place : ";
    std::string birthPlace{};
    std::getline(std::cin, birthPlace);
    std::cout << birthPlace << "\n";

    int age{ currentYear - birthYear };

    std::cout << "=================\n";
    std::cout << "NAME : " << name << "\n";
    std::cout << "AGE : " << age << "\n";
    std::cout << "BIRTHPLACE : " << birthPlace << "\n";
}

// Input:
//
//   John
//   abc
//   1980
//   2020def
//   2022
//   New York
//
// Output:
//
//  Name : John
//  Birth Year : abc
//      Error: 'abc' is not a correct year
//  Birth Year : 1980
//  1980
//  Current Year : 2020def
//      Error: '2020def' is not a correct year
//  Current Year : 2022
//  2022
//  Birth Place : New York
//  =================
//  NAME : John
//  AGE : 42
//  BIRTHPLACE : New York

相关问题