61657
ナル文字を使って、数字文字の出現回数を出力するプログラムを書きたいのですがうまくいきません。自分の見解では、間違っているところが見つけられないのですが、どこが間違っているのでしょうか。

ちなみに、自分は以下のようにプログラムしました。

```

    void str_dcount(const char s[],int cnt[])
    {
        int i;
        i=0;
        while(s[i]!='\0'){
            if('0'<=s[i] && s[i]<='9'){
                cnt[s[i]-'0']++;
            }
            i++;
        }
    }
    
    int main(void)
    {
        char str[128];
        int dcnt[10]={0};
        int i;
        printf("文字列? ");
        scanf("%s",str);
        str_dcount(str,dcnt);
        puts("数字文字の出現回数");
        for(i=0;i<10;i++){
            putchar('\'');
            putchar('0'+i);
            putchar('\'');
            putchar(":%d\n",dcnt[i]);
        }
        return 0;
    }
    
```
CC BY-SA 4.0
2019-12-10T11:38:06.373
61304
2019-12-21T17:13:00.753
2019-12-10T12:40:32.280
3060
36412
question
c
文字列（数字文字の出現回数）
[３つの文字列を連結するプログラムの書き方。](https://ja.stackoverflow.com/q/61651/26370)
の方で使い方に理解が不足しているように見えたので、こちらの対処方法も回答しておきます。

元の`scanf`でも良いのですが、新しいコンパイラでエラー、警告の出ないこちら
[scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l](https://docs.microsoft.com/ja-
jp/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-
s-l?view=vs-2019) を使います。修正は`main`関数だけで、修正箇所にコメントを入れています。

```

    int main(void)
    {
        char str[128] = { 0 };/* 初期化しておく */
        int dcnt[10] = { 0 };
        int i;
        printf("文字列? ");
        scanf_s("%127s", str, 128); /* scanf_sに変更し、最大長を指定 */
        str_dcount(str, dcnt);
        puts("数字文字の出現回数");
        for (i = 0; i < 10; i++) {
            putchar('\'');
            putchar('0' + i);
            putchar('\'');
            printf(":%d\n", dcnt[i]); /* @metropolisさん、@OOPerさん指摘 */
        }
        return 0;
    }
    
```
CC BY-SA 4.0
2019-12-21T17:13:00.753
61657
2019-12-21T17:13:00.753
26370
61304
answer