Here are some C programs from the K&R book with reference to arrays. This resonated with the Perl hashes as this task is nearly always done with a hash, but as C has no hashes, here we go with an array!
The first program classifies the input into whitespace, numbers and everything else. The important points here are:
- ctrl-D to make EOF happen from the keyboard on a Mac
- While and for contracts don’t need {} when there is only one line following.
- EOF is a macro defined in stdio.h
- getchar() collects a single character from STDIN
Here is the code and the output:
# cat counter.c #include <stdio.h> int main( int argc, char *argv[]){ int whitespace, other, counter, c; int digit[10]; for(counter=0;counter<=9;counter++) digit[counter]=0; while( (c = getchar()) != EOF) if (c >= '0' && c <= '9') digit[c - '0']++; else if (c == ' ' || c == '\t' || c== '\n') whitespace++; else other++; printf("Digits = "); for(counter=0;counter<=9;counter++) printf("%d ", digit[counter]); printf(" whitespace = %d, other = %d\n", whitespace, other); } # ./counter < counter.c Digits = 6 1 0 0 0 0 0 0 0 3 whitespace = 103, other = 379
That was pretty much straight from the book, notice i just directed the source file back into the compiled file as a source of input. I could have used any file for input, or even typed in from the keyboard.
The next one is an exercise to create a histogram of word lengths from a file or the keyboard, my histogram was the easier horizontal histogram! My solution is below with the source, compilation and running the code using the source file as input:
# cat histogram.c #include <stdio.h> main (){ int counter, lettercount, c; int words[21]; for (counter=0;counter<=20;counter++) words[counter]=0; lettercount = 0; while ((c = getchar()) != EOF ){ if(c != ' ' && c != '\t' && c != '\n'){ lettercount++; }else{ words[lettercount]++; lettercount=0; } } printf("\n\nWord Length Histogram\n---------------------\n"); for(counter=1;counter<=20;counter++){ printf("%2d: ", counter); for (c=1;c <= words[counter];c++){ printf("*"); } printf("\n"); } } ./histogram < histogram.c Word Length Histogram --------------------- 1: ********** 2: *********** 3: ******* 4: *** 5: * 6: **** 7: 8: ** 9: ** 10: ** 11: * 12: *** 13: * 14: ** 15: 16: * 17: * 18: 19: 20: *