我正在尝试查找使用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;
}
我得到的数字频率异常值。此外,我发现了许多与我的问题类似的问题,但是它们使用的方法不同,我无法理解我的错误。
答案 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