Ключевая проблема - s[j]==i
. Это сравнивает char
строки со значениями от 0 до 9, а не с char
'0'
до '9'
.
Другим является то, что c
не сбрасывается в ноль каждый цикл.
Вместо 10-кратного цикла проверьте, является ли char
цифрой.
Вместо повторного вызова j<strlen(s)
, просто проверьте, если s[j] == 0
size_t digit_frequency[10] = {0};
for (size_t i=0; s[i]; i++) {
if (isdigit((unsigned char) s[i])) {
// or if (s[i] >= '0' && s[i] <= '9') {
digit_frequency[s[i] - '0']++;
}
}
for (size_t i=0; i<10; i++) {
pritnf("%zu\n", s[i]);
}
Код использует size_t
вместо int
в качестве строки. Длина ограничена size_t
- которая может превышать int
в крайних случаях. Либо работай ОК работай размером 100
isdigit()
заявлено в <ctype.h>
(unsigned char)
используется как isdigit()
ожидаемое значение в (unsigned char)
и EOF
, а char
может быть отрицательным.
Различные варианты стиля - все функционируют одинаково.
for (size_t i=0; s[i]; i++) {
for (size_t i=0; s[i] != '\0'; i++) {
for (size_t i=0; s[i] != 0; i++) {
«Заданная строка, состоящая из алфавитов и цифр» является незначительным сокращением. В C строка включает в себя конечный нулевой символ : «A строка представляет собой непрерывную последовательность символов, оканчивающихся и включающих первый нулевой символ» C11 §7.1 .1 1. Тем не менее, люди часто говорят в разговорной речи, так как нулевой символ не был частью строки.