Связанный .lib-файл связан с .dll
У меня была такая же проблема. Скажем, у меня есть проекты MyProject и TestProject. Я эффективно связал файл lib для MyProject с TestProject. Однако этот файл lib был создан, так как была построена DLL для MyProject. Кроме того, я не содержал исходный код для всех методов в MyProject, но только доступ к точкам входа DLL.
Чтобы решить проблему, я построил MyProject как LIB и связал TestProject с этим .lib-файлом (скопируйте вложенный файл .lib в папку TestProject). Затем я смогу снова создать MyProject как DLL. Он компилируется, поскольку lib, с которым связан TestProject, содержит код для всех методов в классах MyProject.
Вы можете проверить это следующим образом:
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;
}
Хех, это старый вопрос, который мог бы использовать лучший ответ.
Пользовательский ввод должен быть получен как строка, а затем попытаться преобразовать в желаемый тип данных. Удобно, это также позволяет вам отвечать на вопросы типа «какой тип данных является моим вводом?»
Вот функция, которую я использую много. Другие варианты существуют, например, в 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
.
Вы можете использовать:
int a = 12;
if (a>0 || a<0){
cout << "Your text"<<endl;
}
Я уверен, что он работает.
В 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 );
}
Из здесь
Вы можете использовать имя переменных, чтобы проверить, является ли значение целым. например:
#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;
}
Если 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