仅将数字作为scanf()的输入并避免使用符号

问题描述 投票:1回答:1

我想使用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循环是一个无限循环。该问题的解决方案是什么?

c++ io scanf
1个回答
0
投票

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::coutusing std::cout带入范围的using namespace std;

© www.soinside.com 2019 - 2024. All rights reserved.