C ++ Как я могу поймать Исключение, если кто-то вводит текст вместо числа? Затем вернитесь и попросите их ввести номер? [Дубликат]

Связанный .lib-файл связан с .dll

У меня была такая же проблема. Скажем, у меня есть проекты MyProject и TestProject. Я эффективно связал файл lib для MyProject с TestProject. Однако этот файл lib был создан, так как была построена DLL для MyProject. Кроме того, я не содержал исходный код для всех методов в MyProject, но только доступ к точкам входа DLL.

Чтобы решить проблему, я построил MyProject как LIB и связал TestProject с этим .lib-файлом (скопируйте вложенный файл .lib в папку TestProject). Затем я смогу снова создать MyProject как DLL. Он компилируется, поскольку lib, с которым связан TestProject, содержит код для всех методов в классах MyProject.

8
задан crush 10 September 2013 в 22:07
поделиться

6 ответов

Вы можете проверить это следующим образом:

int x;
cin >> x;

if (cin.fail()) {
    //Not an int.
}

Кроме того, вы можете продолжать вводить ввод, пока не получите int через:

#include <iostream>



int main() {

    int x;
    std::cin >> x;
    while(std::cin.fail()) {
        std::cout << "Error" << std::endl;
        std::cin.clear();
        std::cin.ignore(256,'\n');
        std::cin >> x;
    }
    std::cout << x << std::endl;

    return 0;
}

EDIT: Чтобы отправить комментарий ниже относительно ввода типа 10abc, можно было бы изменить цикл, чтобы принять строку в качестве входа. Затем проверьте строку для любого символа, а не числа, и соответствующим образом обработайте эту ситуацию. В этой ситуации не нужно очищать / игнорировать входной поток. Проверка строки - это просто цифры, преобразование строки обратно в целое. Я имею в виду, это было как раз от манжеты. Возможно, лучший способ. Это не сработает, если вы принимаете float / doubles (нужно добавить «.» В строку поиска).

#include <iostream>
#include <string>

int main() {

    std::string theInput;
    int inputAsInt;

    std::getline(std::cin, theInput);

    while(std::cin.fail() || std::cin.eof() || theInput.find_first_not_of("0123456789") != std::string::npos) {

        std::cout << "Error" << std::endl;

        if( theInput.find_first_not_of("0123456789") == std::string::npos) {
            std::cin.clear();
            std::cin.ignore(256,'\n');
        }

        std::getline(std::cin, theInput);
    }

    std::string::size_type st;
    inputAsInt = std::stoi(theInput,&st);
    std::cout << inputAsInt << std::endl;
    return 0;
}
19
ответ дан Chemistpp 31 August 2018 в 18:47
поделиться

Хех, это старый вопрос, который мог бы использовать лучший ответ.

Пользовательский ввод должен быть получен как строка, а затем попытаться преобразовать в желаемый тип данных. Удобно, это также позволяет вам отвечать на вопросы типа «какой тип данных является моим вводом?»

Вот функция, которую я использую много. Другие варианты существуют, например, в Boost, но основная предпосылка одна и та же: попытайтесь выполнить преобразование типа string → и убедитесь в успехе или неудаче:

template <typename T>
std::optional <T> string_to( const std::string& s )
{
  std::istringstream ss( s );
  T result;
  ss >> result >> std::ws;      // attempt the conversion
  if (ss.eof()) return result;  // success
  return {};                    // failure
}

Использование типа optional - это просто в одну сторону. Вы также можете выбросить исключение или вернуть значение по умолчанию при сбое. Что бы ни работало для вашей ситуации.

Вот пример его использования:

int n;
std::cout << "n? ";
{
  std::string s;
  getline( std::cin, s );
  auto x = string_to <int> ( s );
  if (!x) return complain();
  n = *x;
}
std::cout << "Multiply that by seven to get " << (7 * n) << ".\n";

ограничения и идентификация типа

Чтобы это работало, Конечно, должен существовать метод однозначного извлечения вашего типа данных из потока. Это естественный порядок вещей на C ++, то есть бизнес как обычно. Так что никаких сюрпризов здесь нет.

Следующее предостережение в том, что некоторые типы объединяют других. Например, если вы пытаетесь различать int и double, сначала проверьте на int, поскольку все, что преобразуется в int, также является double.

2
ответ дан Dúthomhas 31 August 2018 в 18:47
поделиться

Вы можете использовать:

int a = 12;
if (a>0 || a<0){
cout << "Your text"<<endl;
}

Я уверен, что он работает.

-1
ответ дан Eduardo Floriani 31 August 2018 в 18:47
поделиться

В c называется функция isdigit(). Это вам подойдет. Пример:

int var1 = 'h';
int var2 = '2';

if( isdigit(var1) )
{
   printf("var1 = |%c| is a digit\n", var1 );
}
else
{
   printf("var1 = |%c| is not a digit\n", var1 );
}
if( isdigit(var2) )
{
  printf("var2 = |%c| is a digit\n", var2 );
}
else
{
   printf("var2 = |%c| is not a digit\n", var2 );
}

Из здесь

1
ответ дан nook 31 August 2018 в 18:47
поделиться

Вы можете использовать имя переменных, чтобы проверить, является ли значение целым. например:

#include <iostream>
using namespace std;

int main (){

int firstvariable;
int secondvariable;
float float1;
float float2;

cout << "Please enter two integers and then press Enter:" << endl;
cin >> firstvariable;
cin >> secondvariable;

if(firstvariable && secondvariable){
    cout << "Time for some simple mathematical operations:\n" << endl;

    cout << "The sum:\n " << firstvariable << "+" << secondvariable 
    <<"="<< firstvariable + secondvariable << "\n " << endl;
}else{
    cout << "\n[ERROR\tINVALID INPUT]\n"; 
    return 1; 
} 
return 0;    
}
0
ответ дан user 31 August 2018 в 18:47
поделиться

Если istream не может быть вставлен, он установит бит сбоя.

int i = 0;
std::cin >> i; // type a and press enter
if (std::cin.fail())
{
    std::cout << "I failed, try again ..." << std::endl
    std::cin.clear(); // reset the failed state
}

Вы можете установить это в цикле do-while, чтобы получить правильный тип (int в этом случае)

Для получения дополнительной информации: http://augustcouncil.com/~tgibson/tutorial/iotips.html#directly

1
ответ дан Zac Howland 31 August 2018 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: