ANSWERS TO EXERCISES ON STRINGS 1. The point of this exercise is that characters are represented as integers in C. The actual values depend on the system; in ASCII, 65 represents the character 'A', and 48 represents the character '0'. 'A' : A 65 '8' : 8 56 66 : B 66 'A' + 2 : C 67 n = 528 2. They all do. (a) string library function, K+R page 250 (b) K+R page 39 (c) i isn't used until after the statement anyway (d) K+R page 99 (e) Sedgewick, page 114 (f) Sedgewick, page 114 (g) K+R page 103 3. Can't increment array name. Have to copy into pointer as in 2 (d). Note also that this program assumes the input is 100 characters or less. You can use scanf("%100s", a) to ensure this. Remember, one extra character is needed for '\0'. 4. Prints out all the words in the standard input whose characters appear in decreasing order. % a.out my wife tried dancing the polka but everyone laughed 4 wife 5 tried 3 the 5 polka % a.out < /usr/dict/words | grep 6 6 sponge % a.out < ~cs126/files/wordlist.txt | grep 7 7 sponged 7 wronged /usr/dict/words and ~cs126/files/wordlist.txt are files containing lists of English words. The Unix command 'grep 6 filename' prints all lines in the file that contain '6'. 5. Replace the for loop in the program of exercise 3 with for (i = 0; i < N; i++) if (word[i] != word[N-1-i]) break; This solution is twice as slow as it could be: we could stop the for loop in the middle. Exercise: fix the program to do so. % a.out ifihadahifi 11 ifihadahifi % a.out < ~cs126/files/wordlist.txt | grep 7 7 deedeed 7 murdrum 7 repaper 7 reviver 7 rotator 7 sooloos 6. void remove_duplicates(char word[]) { int i, j; char prev = '\0'; for (i = j = 0; word[i] != '\0'; i++) { if (prev != word[i]) word[j++] = word[i]; prev = word[i]; } word[j] = '\0'; } 7. (a) #include <stdio.h> #include <ctype.h> #include <stdlib.h> #define MAX_LEN 10000 int main(int argc, char *argv[]) { int c, i; char a[MAX_LEN + 1]; FILE *filename = fopen(argv[1], "r"); if(filename == NULL) { printf("Error opening file.\n"); exit(EXIT_FAILURE); } i = 0; while ((c = getc(filename)) != EOF) a[i++] = c; a[i] = '\0'; fclose(filename); printf("%s\n", a); return 0; } (b) Modify the while loop as follows. while ((c = getc(filename)) != EOF) if (c == 'a' || c == 'c' || c == 'g' || c == 't') a[i++]; (c) Modify the while loop as follows. Be sure to #include <ctype.h> for the isupper() function. while ((c = getc(filename)) != EOF) if (isupper(c) && c != 'Z') a[i++];