我想采用以下输入格式,scanf()
直到 EOF 将避免“+”符号并仅存储整数值。
输入样本:
1+2+8
上述输入的输出:
1 2 8
我为此编写了以下代码:
while(scanf("%d+",&tmp)) //here 'tmp' is int type variable
{
v.push_back(tmp); //'v' is vector<int> type
}
for (int i = 0; i < v.size(); i++)
{
cout<<v[i]<<" ";
}
不幸的是,while 循环是一个无限循环。这个问题的解决方案是什么?
std::cin
解决方案由于您已经在使用std::cout
1,因此您可以使用std::cin
代替scanf
。现在,先读取数字,然后处理符号:
std::vector<int> numbers;
for (int n; std::cin >> n;) {
numbers.push_back(n);
if (std::cin.peek() == '+') { // if the next character is '+'
std::cin.get(); // then discard it
}
}
scanf
解决方案如果您坚持使用scanf
(在这种情况下您可能也应该使用printf
),您可以使用控制字符串的忽略功能scanf
:
std::vector<int> numbers;
for (int n; std::scanf("%d%*1[+]", &n) == 1;) { // optionally discard '+' after number
numbers.push_back(n);
}
让我们分解%*1[+]
转换规范:
%
——每个转换规范的开始;
*
——这个转换的结果应该被丢弃,而不是分配给一个参数;
1
— 转换的宽度(即要转换的最大字符数);和
[+]
—格式说明符,这意味着匹配最长的字符串,包括+
(当然,受宽度约束)。
总之,这个转换规范意味着“最多丢弃一个+
字符”。
如果不存在+
符号,scanf
则将返回,因为为字段消耗零字符会导致转换错误。下一个字符不会被消耗(这是预期的)。
请注意,scanf
返回成功分配的接收参数(格式字符串之后的参数)的数量(如果在分配第一个接收参数之前发生匹配失败,则可能为零),或者如果在分配第一个接收参数之前发生输入失败,则返回 EOF —请参阅cppreference页面。
1您实际上是在写作cout
,希望std::cout
通过using std::cout
or将其纳入范围using namespace std;
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句