My suggestion to separate the histogram display parts so as to use a dynamic array input data array.
#include <stdio.h>
#include <stdlib.h>
#define MAX_DATA_SIZE 80 //console width is 80 :)
void histogram(int n, int data[n], int max){
char (*disp)[n+1] = malloc(sizeof(char [max+1][n+1]));//Area for display is actually not required.
int r,c;
for(r = 0;r <= max; ++r){
for(c = 0; c <= n; ++c){
if(c == 0){
if(r == 0)
disp[r][c] = '+';
else
disp[r][c] = '|';
} else if(r == 0){
disp[r][c] = '-';
} else {
disp[r][c] = r <= data[c-1] ? '*' : ' ';
}
}
}
for(r = max; r>=0;--r){
for(c =0;c<=n;++c)
printf("%c", disp[r][c]);
printf("\n");
}
}
int main(void){
int data[MAX_DATA_SIZE], max_data = 0;
char input_line[128];
int data_size = 0;
while(fgets(input_line, sizeof(input_line), stdin)){
if(sscanf(input_line, "%d", &data[data_size])==1){
if(data[data_size] > max_data)
max_data = data[data_size];
if(++data_size == MAX_DATA_SIZE)
break;//or malloc & realloc ?
}
}
histogram(data_size, data, max_data);
return 0;
}