Начал изучать Си. Первые трудности. - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Возникла проблема со следующей задачей. Задача из из книги Б. Керниган, Д. Ритчи "Язык программирования Си" Глава 1.6 упражнение 1.13 Книгу онлайн можно найти [ссылка удалена] Програма должна выводить гистограмму длин слов во входном потоке. т.е. надо чтобы выводился массив допустим длинной 15 первый элемент слово из нуля букв второй символ слово из одной буквы третий символ из 2 букв ну и так далее.
#include <stdio.h>
 
/*Программа вывода гистограммы длин слов во входном потоке*/
 
main ()
{
    int i, c, j;
    int length[15];
    
    j = 0;
    
    for (i = 0; i < 15; i++)
        length[i] = 0;
    while ((c = getchar()) != EOF)
        if (c != ' ' || c != '\t' || c != '\n'){
            ++j;
            ++length[c-j];
        }
    printf("Длинна слов =");
    for (i = 0; i < 15; i++)
        printf(" %d", length[i]);
}
Программа компилируется, но выдает не верные результаты. Наверное не верно заполняю массив, как поправить. Зарание спасибо за помощь.

Решение задачи: «Начал изучать Си. Первые трудности.»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define DELIMS " \t\n,;:.!?()"
#define FLD_WIDTH 30
 
void repeatCharacter(char c, size_t cnt)
{
    size_t i;
    for(i = 0; i < cnt; ++i)
    putchar(c);
}
 
int main()
{
    char** words = NULL;
    char buf[BUFSIZ];
    char* word;
    size_t cnt;
    size_t i;
    size_t len;
        
    puts("Please input a line (following with the newline character)");
    fgets(buf, BUFSIZ, stdin);
    
    for(word = strtok(buf, DELIMS), cnt = 0;
    word;
    word = strtok(NULL, DELIMS))
    {
    if((words = (char**) realloc(words, ++cnt * sizeof(char*))) == NULL)
    {
        fputs("Can't allocate memory\n", stderr);
        exit(1);
    }
    if((words[cnt - 1] = strdup(word)) == NULL)
    {
        fputs("Can't duplicate word\n", stderr);
        exit(2);
    }
    }
    
    for(i = 0; i < cnt; ++i)
    {
    len = strlen(words[i]);
    if(len < FLD_WIDTH)
        repeatCharacter(' ', FLD_WIDTH - len);
    repeatCharacter('*', len);
    printf(" [%u] %s\n", len, words[i]);
    free(words[i]);
    }
 
    free(words);
 
    exit(0);
}

Оцени полезность:

6   голосов , оценка 3.333 из 5
Похожие ответы