scanf() 只取数字作为输入,避免其他字符

伊姆蒂亚兹·迈赫迪

我想采用以下输入格式,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::cout1,因此您可以使用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::coutor将其纳入范围using namespace std;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章