Неправильное преобразование типа void to char - C (СИ)
Формулировка задачи:
Стоит задача... написать прогу , которая считает количество введенных символов и выводит вероятность нахождения каждого символа в строке.
Для начала я хочу узнать количество символов, которое я помещаю в переменную t. Потом хочу динамически выделить память для массива размером t элементов, но на этом этапе у меня выходит ошибка. Только начинаю дружить с си и адресной арифметикой не ругайте строго) в чем проблема не знаю...
18 28 D:\programing\test\main.cpp [Error] invalid conversion from 'void*' to 'char*' [-fpermissive]
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main(void)
{
char *p;
char ch;
int t=0;
printf("input some text\nfor exit input . \n");
do
{
ch = getchar();
t++;
} while (ch != '.');
printf("%d",t);
p = malloc(t*sizeof(char));
return 0;
}Решение задачи: «Неправильное преобразование типа void to char»
textual
Листинг программы
#include "string.h" // strcspn
#include "stdio.h" // fgets
double* char_freq(const char* str)
{
static double freq[256];
int i;
for( i = 0; i < 256; ++i ) { freq[i] = 0.0; }
double sum = 0.0;
while( i = (unsigned char) *str++ ) {
freq[i] += 1.0;
sum += 1.0;
}
if( sum != 0.0 ) {
for( i = 0; i < 256; ++i ) { freq[i] /= sum; }
}
return freq;
}
void chomp(char* str)
{
str += strcspn(str, ".\n");
*str = '\0';
}
int main(void)
{
char buf[100];
while( fgets(buf, sizeof(buf), stdin) ) {
chomp(buf);
double* freq = char_freq(buf);
int i;
for( i = 0; i < 256; ++i ) {
if( freq[i] != 0.0 ) { printf("Frequency of %c = %f\n", (char) i, freq[i]); }
}
}
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы: string.h (для функции strcspn) и stdio.h (для функции fgets).
- Определяем функцию char_freq, которая принимает на вход указатель на строку (const char str) и возвращает массив частот (double) для каждого символа в строке.
- Создаем статический массив double freq[256] для хранения частот каждого символа.
- В функции main создаем буфер (buf) для чтения строк из стандартного ввода.
- В цикле while считываем строки с помощью функции fgets и вызываем функцию chomp для удаления символов новой строки и точки.
- Вызываем функцию char_freq для вычисления частоты каждого символа в строке.
- В цикле for выводим каждую частоту, которая не равна нулю, с помощью функции printf.
- Возвращаем 0 в конце функции main, чтобы указать, что программа успешно завершилась.