есть некоторые проблемы в вашем коде
- не использовать получает , он устарел, и если вы вводите слишком длинный ввод, вы записываете из получающей строки снеопределенное поведение
- ваш цикл с k бесполезен
- вы используете int , но правильный тип
size_t
, потому что int может быть недостаточно большим
Один из способов - изменить строку, предположив, что вы не хотите считать строки, а также изменить способ печати результата, чтобы сделать его более читабельным:
#include <stdio.h>
int main()
{
char a[20];
if (fgets(a, sizeof(a), stdin) != NULL) {
for (size_t j = 0; a[j] != 0; ++j) {
char c = a[j];
if (c != '\n') {
size_t count = 1;
for (size_t i = j + 1; a[i] != 0; i++) {
if (a[j] == a[i]) {
count += 1;
a[i] = '\n'; /* to not count it again */
}
}
printf("%c : %zu\n", a[j], count);
}
}
}
return 0;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
tree
t : 1
r : 1
e : 2
pi@raspberrypi:/tmp $ ./a.outpi@
output input
o : 1
u : 3
t : 3
p : 2
: 1
i : 1
n : 1
pi@raspberrypi:/tmp $
Если вы хотите управлять всеми символами, включая символ новой строки, вы можете запомнить начальную длину строки для циклов и использовать символ 0 дляпометить уже количество символов.Конечно, если вам не нужно изменять исходную строку, просто поработайте над ее копией или используйте дополнительный массив, содержащий количество символов (индекс - это код символа, предупреждающий, если символы подписаны), или проверьте,текущий символ присутствует в предыдущих