C++ 中的简单 FizzBuzz 程序出现意外输出

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

我只是尝试实现一个简单的 FizzBuzz 程序,我试图将规则集与逻辑分开,这是我在编译器资源管理器中尝试执行此操作的尝试,没有使用任何 IDE 或调试工具。

#include <cstdint>
#include <map>
#include <string>

typedef std::map<uint32_t,std::string> RuleSet;

RuleSet ruleSet { {3, "fizz"},
                  {5, "buzz"}
};

void fizzBuzz(int32_t max_limit, RuleSet rules) {
    std::string output{""};
    for (uint32_t i = 1; i < max_limit; i++) {        

        for (auto r : rules) {
            if ( (i % r.first) == 0 ) {
                output = r.second;
            } else {
                output = std::to_string(i);
            }
        }
        output.append(1, '\n');
        std::cout << output;
        output.clear();
    }
}

int main() {
    fizzBuzz(100, ruleSet);
    return 0;
}

这里是编译器资源管理器中的链接:编译器资源管理器

在执行单元内,它正在打印数值,并且正在打印嗡嗡声,但就我的一生而言,我试图弄清楚为什么它没有在任何地方打印嘶嘶声...任何类型的提示、建议或见解为什么我得到的输出是我会有所帮助的。请注意,我不是在 IDE 中编写或运行它,因为我目前无法访问调试器来单步调试我的代码。这是直接在编译器资源管理器中实现的。我知道我忽略了一些东西,但此时任何帮助都是值得赞赏的。


预期输出应该是:

1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
// and so on...

这是我从编译器资源管理器获得的实际输出:

1
2
3
4
buzz
6
7
8
9
buzz
11
12
13
14
buzz
16
17
18
19
buzz
21
22
23
24
buzz
26
27
28
29
buzz
31
32
33
34
buzz
36
37
38
39
buzz
41
42
43
44
buzz
46
47
48
49
buzz
51
52
53
54
buzz
56
57
58
59
buzz
61
62
63
64
buzz
66
67
68
69
buzz
71
72
73
74
buzz
76
77
78
79
buzz
81
82
83
84
buzz
86
87
88
89
buzz
91
92
93
94
buzz
96
97
98
99
c++ output stdmap stdstring
1个回答
0
投票

问题是当条件(i % r.first)

满足时,你没有跳出内部for循环。

因此,要获得预期的输出,只需在

break

 块内添加 
if
 语句,如下所示:

for (auto r : rules) { if ( (i % r.first) == 0 ) { output = r.second; //------vvvvv------------------>added this break statement break; } else { output = std::to_string(i); } }

工作演示

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