我想使用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);
std::cin.ignore(1, '+'); // discard one '+' character if there is one
}
scanf
解决方案如果您坚持使用scanf
(在这种情况下,您可能还应该使用printf
,则可以使用scanf
的控制字符串的忽略功能:
std::vector<int> numbers;
for (int n; std::scanf("%d%*1[+]", &n) == 1;) {
numbers.push_back(n);
}
让我们打破%*1[+]
转换规范降级:
%
-每个转换规范的开头;
*
-此转换的结果应丢弃,而不是分配给参数;
1
-转换宽度(即要转换的最大字符数);和
[+]
— format specifier,这意味着专门匹配包含+
的最长字符串(当然要受宽度限制)。
总而言之,此转换规范的意思是“最多丢弃一个+
字符”。
请注意,scanf
返回成功分配的接收参数的数量(格式字符串后的参数)(如果在分配第一个接收参数之前发生匹配失败,则可以为零),如果输入失败则返回EOF在分配第一个接收参数之前发生-请参见cppreference页面。
1您实际上是在编写cout
,希望它是由std::cout
或using std::cout
带入范围的using namespace std;
。