Blame


1 5dc21454 2023-07-14 jrmu /*
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.
7 5dc21454 2023-07-14 jrmu */
8 5dc21454 2023-07-14 jrmu
9 5dc21454 2023-07-14 jrmu #include <stdio.h>
10 5dc21454 2023-07-14 jrmu
11 5dc21454 2023-07-14 jrmu int expand(char *s1, char *s2);
12 5dc21454 2023-07-14 jrmu
13 5dc21454 2023-07-14 jrmu int main()
14 5dc21454 2023-07-14 jrmu {
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);
34 5dc21454 2023-07-14 jrmu return 0;
35 5dc21454 2023-07-14 jrmu }
36 5dc21454 2023-07-14 jrmu
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';
41 5dc21454 2023-07-14 jrmu char next;
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++;
52 5dc21454 2023-07-14 jrmu }
53 5dc21454 2023-07-14 jrmu s1++;
54 5dc21454 2023-07-14 jrmu }
55 5dc21454 2023-07-14 jrmu }
56 5dc21454 2023-07-14 jrmu prev = *s2++ = *s1++;
57 5dc21454 2023-07-14 jrmu }
58 5dc21454 2023-07-14 jrmu *s2 = '\0';
59 5dc21454 2023-07-14 jrmu return expansions;
60 5dc21454 2023-07-14 jrmu }