2 5dc21454 2023-07-14 jrmu * Exercise 3-3. Write a function expand(s1, s2) that expands shorthand
3 5dc21454 2023-07-14 jrmu * notations like a-z in the string s1 into the equivalent complete list
4 5dc21454 2023-07-14 jrmu * abc...xyz in s2. Allow for letters of either case and digits, and be
5 5dc21454 2023-07-14 jrmu * prepared to handle cases like a-b-c and a-z0-9 and -a-z. Arrange that
6 5dc21454 2023-07-14 jrmu * a leading or trailing - is taken literally.
9 5dc21454 2023-07-14 jrmu #include <stdio.h>
11 5dc21454 2023-07-14 jrmu int expand(char *s1, char *s2);
15 5dc21454 2023-07-14 jrmu char expansion[200];
16 5dc21454 2023-07-14 jrmu expand("a-z", expansion);
17 5dc21454 2023-07-14 jrmu printf("Expect: abcdefghijlkmnopqrstuvwxyz\n");
18 5dc21454 2023-07-14 jrmu printf("Result: %s\n", expansion);
19 5dc21454 2023-07-14 jrmu expand("A-Z", expansion);
20 5dc21454 2023-07-14 jrmu printf("Expect: ABCDEFGHIJLKMNOPQRSTUVWXYZ\n");
21 5dc21454 2023-07-14 jrmu printf("Result: %s\n", expansion);
22 5dc21454 2023-07-14 jrmu expand("0-9", expansion);
23 5dc21454 2023-07-14 jrmu printf("Expect: 0123456789\n");
24 5dc21454 2023-07-14 jrmu printf("Result: %s\n", expansion);
25 5dc21454 2023-07-14 jrmu expand("a-z0-9", expansion);
26 5dc21454 2023-07-14 jrmu printf("Expect: abcdefghijlkmnopqrstuvwxyz0123456789\n");
27 5dc21454 2023-07-14 jrmu printf("Result: %s\n", expansion);
28 5dc21454 2023-07-14 jrmu expand("-a-z", expansion);
29 5dc21454 2023-07-14 jrmu printf("Expect: -abcdefghijlkmnopqrstuvwxyz\n");
30 5dc21454 2023-07-14 jrmu printf("Result: %s\n", expansion);
31 5dc21454 2023-07-14 jrmu expand("a-b-c", expansion);
32 5dc21454 2023-07-14 jrmu printf("Expect: abc\n");
33 5dc21454 2023-07-14 jrmu printf("Result: %s\n", expansion);
37 5dc21454 2023-07-14 jrmu /* return value is number of expansions */
38 5dc21454 2023-07-14 jrmu int expand(char *s1, char *s2) {
39 5dc21454 2023-07-14 jrmu int expansions = 0;
40 5dc21454 2023-07-14 jrmu char prev = '\0';
42 5dc21454 2023-07-14 jrmu while (*s1) {
43 5dc21454 2023-07-14 jrmu if (*s1 == '-') {
44 5dc21454 2023-07-14 jrmu next = *(s1+1);
45 5dc21454 2023-07-14 jrmu if ((prev >= 'a' && next <= 'z') ||
46 5dc21454 2023-07-14 jrmu (prev >= 'A' && next <= 'Z') ||
47 5dc21454 2023-07-14 jrmu (prev >= '0' && next <= '9')) {
48 5dc21454 2023-07-14 jrmu prev++; /* first letter copied by default */
49 5dc21454 2023-07-14 jrmu expansions++;
50 5dc21454 2023-07-14 jrmu while (prev < next) { /* last letter copied by default */
51 5dc21454 2023-07-14 jrmu *s2++ = prev++;
56 5dc21454 2023-07-14 jrmu prev = *s2++ = *s1++;
59 5dc21454 2023-07-14 jrmu return expansions;