// produce a list of random words #include <stdio.h> #include <stdlib.h> #include <time.h> #include <assert.h> #include <string.h> #include <ctype.h> // create a "random" seed for random number generation int make_seed() { // use current time in second * processor time time_t now = time(NULL); clock_t ticks = clock(); return now * ticks; } // trim of leading/trailing punctuation and digits, convert to lower case char * fixed(char *s) { if (s == NULL) return NULL; // find beginning of string - skip past non-alpha char * begin = s; while (*begin && ! isalpha(*begin)) begin++; // last character in the string char * last = begin + strlen(begin) - 1; // decrease last as long as it is non-alpha and not before begin while (begin <= last && ! isalpha(*last)) { *last = '\0'; last--; } // if went past beginning of string if (last < begin) return begin; // everything in between begin and last - tolower them for(char *p=begin; p <= last; p++) *p = tolower(*p); return begin; } int main(int argc, char * argv[]) { // usage statement if (argc < 3) { printf("Usage: ./randomWords howMany wordsFile.txt [seed]\n"); printf(" randomWords will choose howMany random words, which are each\n" " chosen from the words in wordsFile.txt.\n" " If a seed is given as input it is used to seed the pseudorandom number generator\n" " (so you can use the same seed and get the same \"random\" list each time you\n" " run the program. If no seed given, then a seed is used based on\n" " the current time in seconds and the # clock cycles elapsed in the program\n" " generating the numbers. Note - srand and rand from the C standard library\n" " are used for generating the pseudorandom #'s.\n\n"); exit(0); } // get args int howMany = atoi(argv[1]); const char * wordsFile = argv[2]; // seed the random number generator int seed; if (argc > 3) seed = atoi(argv[3]); else seed = make_seed(); srand(seed); // read words from file int sizeArray = 1000; int numWords = 0; char **words = (char **) malloc(sizeof(char *) * sizeArray); // note that we store duplicate words multiple times FILE * f = fopen(wordsFile, "r"); assert(f != NULL); char s[100]; while (fscanf(f, "%99s", s) == 1) { char * s_fixed = fixed(s); if (strlen(s_fixed) <= 0) continue; if (numWords >= sizeArray) { words = realloc(words, sizeArray*2*sizeof(char *)); sizeArray *= 2; } words[numWords++] = strdup(s_fixed); } fclose(f); assert(numWords > 0); // how pick random words for(int i=0; i < howMany; i++) { // pseudorandom int int r = rand(); r = (r % numWords); printf("%s\n", words[r]); } return 0; }