我无法找到问题,它没有给我正确的答案,例如:我把1234567890,它给了我一系列奇怪的数字,我是新的所以我无法发布图片:
#include <stdio.h>
int main()
{
int n,i;
int m[10];
while((n=getchar())!='\n') {
++m[n-'0'];
}
for(i=0;i<10;++i) {
printf("%d\n",m[i]);
}
return 0;
}
答案 0 :(得分:5)
基本问题是您没有初始化数组 在计算数字之前。
int m[10] = {0};
此外,您应该处理非数字值以便程序 不会崩溃,例如
while((n=getchar())!='\n')
{
if ( isdigit(n) )
{
++m[n-'0'];
}
}
(如果包含ctype.h,则可以使用isdigit())
答案 1 :(得分:1)
使用以下内容将数组内容初始化为0而不是随机发生在内存中的任何内容:
int m[10]={0};
答案 2 :(得分:1)
有些人已经建议包括
int m[10] = {0};
这会奏效。根据您的编译器和优化选项,可能不会导致“最佳”代码。另一种选择,我更喜欢在使用之前调用memset()将数组初始化为0。这是修改后的程序(另请注意,您不需要n和i,但优化编译器也会同时处理):
#include <stdio.h> /* for getchar() and printf() */
#include <string.h> /* for memset() */
#include <ctype.h> /* for isdigit() */
int main(int argc, char* argv[])
{
int n, m[11];
memset(m, 0, sizeof(m)); /* initialize counters to zero's */
while ((n=getchar()) != '\n')
{
if (isdigit(n))
{
++(m[n-'0']);
}
else
{
++(m[10]);
}
}
for(n=0;n<10;n++)
printf("%c : %d\n",'0'+n, m[n]);
printf("Filtered characters: %d\n",m[10]);
return 0;
}
示例运行如下所示:
$ ./a.out
At 12:45 p.m. I ran to the 7-11 for a 48oz big gulp
0 : 0
1 : 3
2 : 1
3 : 0
4 : 2
5 : 1
6 : 0
7 : 1
8 : 1
9 : 0
Filtered characters: 42
$
作为最后一点,我查看了gcc生成的汇编指令输出的不同大小m []。对于小型数组(例如m [10] = {0};),Gcc生成内联代码(有时循环,有时根据优化而展开),并生成memset()的调用,如我对较大的数组所示(例如m [100] ] = {0};)。可以从中得出的结论是将代码保留为m [10] = {0};允许编译器根据它对目标系统的了解选择最佳解决方案,这几乎肯定比你所知道的更多。
答案 3 :(得分:-1)
好吧,既然你没有列出你的问题是什么,我只能猜测,但不试图编译它,最明显的问题是&#34; m&#34;阵列。 [评论中指出错误的东西]
修改强> 此外,如果您输入的数字或换行符以外的字符,您将覆盖&#34; m&#34;之外的内存。阵列也是。