使用while循环的C ++中的数字频率

时间:2018-07-17 13:05:42

标签: c++

我正在尝试查找使用while循环输入的文本的数字频率。我使用的代码如下所示。

#include <iostream>
#include <string>
using namespace std;

int main () {
    char c;
    int a[10] = {0};

    while ((c=getchar()) != '\n') {
        switch (c) {
            case 0:
                a[0] += 1;
                break;
            case 1:
                a[1] += 1;
                break;
            case 2:
                a[2] += 1;
                break;
            case 3:
                a[3] += 1;
                break;
            case 4:
                a[4] += 1;
                break;
            case 5:
                a[5] += 1;
                break;
            case 6:
                a[6] += 1;
                break;
            case 7:
                a[7] += 1;
                break;
            case 8:
                a[8] += 1;
                break;
            case 9:
                a[9] += 1;
                break;                                  

        }


    }

    for (int i=0 ; i<10 ; i++) {
        cout << a[i] << " ";
    }

    return 0;

}

我得到的数字频率异常值。此外,我发现了许多与我的问题类似的问题,但是它们使用的方法不同,我无法理解我的错误。

2 个答案:

答案 0 :(得分:2)

错误的地方

1)在C ++中使用getchar()(这是C I / O函数)。尽管允许,但不建议使用。在给定#include <iostream>的情况下,也不能保证它能正常工作,而且,如果它可以与您的编译器/库一起使用,您会很幸运。请改用std::cin.get()

2)getchar()cin.get()都返回int。您的代码将忽略该错误,并将返回值分配给char。这两个函数都可以返回char无法表示的值,并以此报告错误。因此,您的代码将忽略读取输入时发生的任何错误。

3)在标准C和C ++中,字符'0'不能具有数字值0。仅当switch的数值为case时,您的'0' / 0才能工作。例如,在ASCII字符集中,字符'0'的数字值48不等于0(并且存在'0'48(不是0)不同的值)。够了。

4)在标准C和C ++中,代表数字'0''1',... '9'的字符是连续的。也没有标准化的字符集,这些数字不连续。

更正所有这些错误的东西。

1)将cin.get()的返回值存储到int中,并进行检查(例如,查看是否有错误)。

2)使用标准标头isdigit()中的函数<cctype>检查字符是否为数字。请记住,如果给定isdigit()不能代表的值,则unsigned char的行为不确定。

3)使用数字从'0'开始连续的事实。

我将不提供代码,但是您会发现,通过所有这些点来工作将有助于解决您的问题,并使您的代码更易于理解,因此更容易理解。

提示:根本不需要使用switch语句,除非您需要更长且更容易出错的代码。所需要做的只是检查一个字符是否已正确读取,并且它是一个数字,并递增相应的数组元素。可以使用数组语法来增加数组a的特定元素。

答案 1 :(得分:1)

如评论中所建议,您假设'0'的编码等于值0。情况并非如此。

最简单的解决方法是稍微更改您的switch语句:

CompleteableFuture