Спецификация для вашей функции неполная:
- может ли строка содержать нецифровые символы?
- что должно быть возвращено, если вообще нет цифр?
- какое значение должно быть возвращено, если есть несколько цифр с одинаковым максимальным числом вхождений?
- должна ли функция возвращать цифру или ее числовое значение? Ваша
main()
функция использует последнее, но это не ясно из текста вопроса.
Функция most
получает указатель на строку. Вы можете написать цикл, в котором вы обрабатываете один символ за раз и увеличиваете указатель для следующей итерации, пока не достигнете конца строки. Вы также должны решить, что возвращать, если строка не содержит цифр.
Вот простой пример:
int most(const char *s) {
int count[10] = { 0 };
int res, i, max;
while (*s) {
if (*s >= '0' && *s <= '9')
count[*s - '0']++;
s++;
}
res = -1; /* return -1 if no digits */
max = 0;
for (i = 0; i < 10; i++) {
if (count[i] > max)
res = i;
}
return res;
}
Если вам вообще запрещено использовать какой-либо массив, выделение блока памяти кажется действительно хорошим решением:
int most(const char *s) {
int *count = calloc(sizeof(*count), 10);
int res, i, max;
while (*s) {
if (*s >= '0' && *s <= '9')
*(count + *s - '0') += 1;
s++;
}
res = -1; /* return -1 if no digits */
max = 0;
for (i = 0; i < 10; i++) {
if (*(count + i) > max)
res = i;
}
free(count);
return res;
}
Обозначение *(count + *s - '0') += 1
работает следующим образом: count
является указателем на массив int
, выделенный и инициализированный в 0
с помощью calloc
. *s - '0'
- это цифровое значение n символа, на который указывает s
, которое было проверено на наличие цифры. count + *s - '0'
- указатель на n-ую запись в массиве. *(count + *s - '0') += 1
увеличивает это значение на единицу.
Есть способы сделать это без выделения памяти, с 10 переменными и явными тестами для различных цифр, но я сомневаюсь, что это будет ожидаемое решение.
Если вы можете объяснить свой выбор своему учителю, есть 2 способа использовать массивы без символов [
и ]
. Это устаревшие функции стандарта C, с которыми большинство программистов не знакомы и которые можно игнорировать, если вам не интересно:
int most(const char *s) { /* version with C99 digraphs */
int count<:10:> = { 0 };
int res, i, max;
while (*s) {
if (*s >= '0' && *s <= '9')
count<:*s - '0':>++;
s++;
}
res = -1; /* return -1 if no digits */
max = 0;
for (i = 0; i < 10; i++) {
if (count<:i:> > max)
res = i;
}
return res;
}
Или
int most(const char *s) { /* version with old-style trigraphs */
int count??(10??) = { 0 };
int res, i, max;
while (*s) {
if (*s >= '0' && *s <= '9')
count??(*s - '0'??)++;
s++;
}
res = -1; /* return -1 if no digits */
max = 0;
for (i = 0; i < 10; i++) {
if (count??(i??) > max)
res = i;
}
return res;
}