- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写一个 if 语句,但找不到要使用的正确表达式形式。我正在考虑写这样的东西:
if ( var != type(int) )
但是,我不确定具体该怎么做,而且这种方法行不通。
至少我的思路是正确的吗?
最佳答案
听起来您正在尝试重载函数:
void foo(int i)
{
// stuff
}
void foo(float f)
{
// stuff
}
int main(void)
{
int i = 10;
float f = 1.0f;
foo(i); // calls foo(int)
foo(f); // calls foo(float)
}
如果你想要 int
- 特殊行为,然后在所有其他情况下想要其他东西,你可以使用模板:
template <typename T>
void foo(T t)
{
// T is something
}
template <>
void foo(int i)
{
// for int's only
}
int main(void)
{
int i = 10;
float f = 1.0f;
double d = 2.0;
foo(i); // calls specialized foo
foo(f); // calls generic foo
foo(d); // calls generic foo
}
根据您的评论 (“手头的任务是一个简单的程序:取两个用户输入的整数并将它们相加。将输入限制为仅整数。我可以在 Python 中完成,我也在按照这些思路进行思考。 if num1 != type(int): print "You did not enter an integer, please enter a integer."else: continue"), 你想要这样的东西:
#include <iostream>
int main(void)
{
int i;
std::cin >> i;
if (std::cin.fail())
{
std::cout << "Not valid!" << std::endl;
}
else
{
// ...
}
}
这将通知诸如“@#$”、“r13”之类的无效输入,但不会捕获诸如“34fg”、“12$#%”之类的情况,因为它将读取int
,并分别在“fg”和“$#%”处停止。
要检查这一点,您必须读入一行输入,然后尝试将该行转换为您想要的类型。 (谢谢,litb)。这意味着您的问题更多 like this question :
#include <iostream>
#include <sstream>
#include <string>
int main(void)
{
std::string input;
std::getline(std::cin, input);
std::stringstream ss(input);
int i;
ss >> i;
if (ss.fail() || !(ss >> std::ws).eof())
{
std::cout << "Not valid!" << std::endl;
}
else
{
// ...
}
}
这会执行以下操作:获取输入,并将其放入 stringstream
。然后在解析 int
之后,流出任何剩余的空白。之后,如果 eof
为 false,则表示有剩余字符;输入无效。
包裹在函数中使用起来更容易。在另一个问题中,类型转换被重构了;在这个问题中,我们使用了强制转换,但将输入与它一起包装起来。
#include <iostream>
#include <sstream>
#include <string>
bool parse_int(int& i)
{
std::string input;
std::getline(std::cin, input);
std::stringstream ss(input);
ss >> i;
return !(ss.fail() || !(ss >> std::ws).eof());
}
int main(void)
{
int i;
if (!parse_int(i))
{
std::cout << "Not valid!" << std::endl;
}
else
{
// ...
}
}
或者更笼统地说:
#include <iostream>
#include <sstream>
#include <string>
template <typename T>
bool parse_type(T& t)
{
std::string input;
std::getline(std::cin, input);
std::stringstream ss(input);
ss >> t;
return !(ss.fail() || !(ss >> std::ws).eof());
}
int main(void)
{
int i;
if (!parse_type(i))
{
std::cout << "Not valid!" << std::endl;
}
else
{
// ...
}
}
这让您可以通过错误检查来解析其他类型。
如果您对异常没问题,使用 lexical_cast
(来自 boost 或“伪造”,请参阅代码中链接的其他问题 [与上面的链接相同]),您的代码看起来像这样:
#include <iostream>
#include <sstream>
#include <string>
/* Faked lexical-cast from question:
https://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/
*/
template <typename T>
T lexical_cast(const std::string& s)
{
std::stringstream ss(s);
T result;
if ((ss >> result).fail() || !(ss >> std::ws).eof())
{
throw std::bad_cast("Bad cast.");
}
return result;
}
template <typename T>
T parse_type(void)
{
std::string input;
std::getline(std::cin, input);
return lexical_cast<T>(input);
}
int main(void)
{
try
{
int i = parse_type<int>();
float f = parse_type<float>();
}
catch (const std::exception& e)
{
std::cout << e.what() << std::endl;
}
}
我认为 boost 没有词法转换的非抛出版本,因此我们可以通过捕获 bad_cast
来制作此代码的 true/false 而不是异常版本,如下所示。再一次,这适用于 boost
或自定义词法转换。 (任何执行词法转换并抛出 bad_cast
的东西):
#include <iostream>
#include <sstream>
#include <string>
/* Faked lexical-cast from question:
https://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/
*/
template <typename T>
T lexical_cast(const std::string& s)
{
std::stringstream ss(s);
T result;
if ((ss >> result).fail() || !(ss >> std::ws).eof())
{
throw std::bad_cast("Bad cast.");
}
return result;
}
template <typename T>
bool parse_type(T& t)
{
std::string input;
std::getline(std::cin, input);
try
{
t = lexical_cast<T>(input);
return true;
}
catch (const std::bad_cast& e)
{
return false;
}
}
int main(void)
{
int i;
if (!parse_type(i))
{
std::cout << "Bad cast." << std::endl;
}
}
现在返回到 bool
结果,除了我们通过使用现有的 lexical_cast
函数避免代码重复。
您当然可以选择要使用的方法。
关于C++ 语法问题 : if var ! = type int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1435253/
这个问题已经有答案了: Can I bind an array to an IN() condition in a PDO query? (23 个回答) 已关闭 5 年前。 任何人都可以看到我如何在
我阅读了关于此的 bash 手册页,但我不明白其中的区别。我对它们进行了测试,它们似乎产生了完全相同的结果。 如果值不是通过命令行参数设置的,我想设置一个变量的默认值。 #!/bin/bash var
我为我的网站开了一家商店,并让它运行起来,但我意识到它无法正确购买商品。换句话说,您不会走进一家商店,拿起一件商品,购买,再次购买,购买,再次购买,等等,以获得想要的数量。你一次捕获他们。我的网站缺少
基本上,我想知道为什么会这样(将列表的内存地址作为参数传递): void init_lista (elemPtr *list) { *list = NULL; } int main(){
看到这个问题:Is there a (built-in) way in JavaScript to check if a string is a valid number?还有这个:jsperf ,其
我有以下字符串: 我想用正则表达式替换所有后面有 px 的数字,并用 X 乘以它们的值。 (X 是一个变量)。 所以如果X=3,结果就是 请注意 X 必须是我将检索到函数的变量 最佳答案 以下代码
这个问题在这里已经有了答案: 关闭 13 年前。 同时 (var != var) System.out.println("循环.."); 执行它..如何声明..var
我只是好奇。我想知道表达式是否有特定原因 var &= expr 行为方式与不同 var = var && expr. 看起来第一个表达式中的表达式正在执行,而不管 var 上的 false 值。 我
我有这个 Ruby 代码: var1 = 10 puts var1.object_id var1 = var1 + 0 puts var1.object_id var1 = var1 + 1 puts
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: demote boost::function to a plain function pointer 所以我
好吧,堆栈溢出, 我花了几个小时来解决 javascript 中的问题(在 NodeJS 服务器中编写),但我真的不明白。 这就是发生的事情: var data = {x: 50}; var temp
首先,我在这里处理 1 和 0,我很清楚 1 == true 和 0 == false。但是我很好奇为什么这不起作用: $var = 1; echo $var; /* 1 */ $var = $var
标题说的是什么:将变量封装在 {}、"" 或 "{}"中是什么意思?我无法在网上找到关于此的任何解释 - 除了使用不会产生任何结果的符号外,我无法引用它们。 这是一个例子: declare -a gr
我需要将信息发送到我的 Html。例如 $(document).ready(function() { var = "'#"+result.tag+"'" // var = '#tag_dinamy
是否可能,如果可以,如何将以下表达式转换为一行? DEV=$(lsblk -no KNAME,MODEL | grep 'ModelNAME') DEV=${DEV%%'ModelNAME'} 简单的
isset($var) == "Test" 和 isset($var) && $var == 'Test" 有什么区别? 最佳答案 这里是一个简短的例子: $var = "Chuck Test"; v
isset($var) == "Test" 和 isset($var) && $var == 'Test" 有什么区别? 最佳答案 这里是一个简短的例子: $var = "Chuck Test"; v
如果我有一个字符串:[Object a:var b:var c:var]; 如何将 a:、b: 和 c: 与正则表达式匹配? 我试过:\[.+\s+(.+:).+\] 但它不适用于 a、b 和 c,它
这个问题在这里已经有了答案: Why does this if-statement combining assignment and an equality check return true? (
我正在 Powershell 中使用 SCSM,但遇到了 if 语句的问题。 我有一个函数,它根据作为变量传递给函数的条件收集数据。 例子: $JMLs1 = collectTickets -crit
我是一名优秀的程序员,十分优秀!