为什么此代码未打印正确的数字频率?

时间:2019-09-13 09:36:21

标签: c

以下是问题说明:

  

给出一个由字母和数字组成的字符串,找出给定字符串中每个数字的频率。

     

输入格式:

     

第一行包含一个字符串num,它是给定的数字。   num的所有元素均由英文字母和数字组成。

     

输出格式:

     

在一行中打印十个以空格分隔的整数,表示每个数字从到的频率。

我已经使用switch尝试了这段代码,但是我不知道为什么它没有给出正确的答案

对于此输入(a11472o5t6),我希望此输出(0 2 1 0 1 1 1 1 0 0) 但是我得到了以下输出:(1 2 3 0 1 2 1 1 1 0)

代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    char string[1000];
    int count[10] = {0};
    scanf("%s", string);    

    for(int i = 0; i < 1000; ++i){

        switch(string[i]){

            case '0':
                count[0]++;
                break;
            case '1':
                count[1]++;
                break;
            case '2':
                count[2]++;
                break;
            case '3':
                count[3]++;
                break;    
            case '4':
                count[4]++;
                break;
            case '5':
                count[5]++;
                break;
            case '6':
                count[6]++;
                break;                
            case '7':
                count[7]++;
                break;
            case '8':
                count[8]++;
                break;
            case '9':
                count[9]++;
                break;
            default:
                break;
        }

    }

    for(int i = 0; i < 10; ++i){

        printf("%d ", count[i]);

    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您要遍历1000个字符,但是scanf不会用零或类似的数字填充string的其余部分。它会添加一个终止符'\0',此后会出现垃圾,其中可能包括您要计数的字符。

因此,而不是从0循环到999:

for(int i = 0; i < 1000; ++i){

循环播放直到结束:

for (int i = 0; string[i] != '\0'; i++) {