Home Books by K. N. King Short courses Recommended books Recommended links FAQ

### Chapter 13

2. [was #2]

(a) Illegal; `p` is not a character.
(b) Legal; output is `a`.
(c) Legal; output is `abc`.
(d) Illegal; `*p` is not a pointer.

4. [was #4]

(a)

```int read_line(char str[], int n)
{
int ch, i = 0;

while ((ch = getchar()) != '\n')
if (i == 0 && isspace(ch))
;   /* ignore */
else if (i < n)
str[i++] = ch;
str[i] = '\0';
return i;
}
```

(b)

```int read_line(char str[], int n)
{
int ch, i = 0;

while (!isspace(ch = getchar()))
if (i < n)
str[i++] = ch;
str[i] = '\0';
return i;
}
```

(c)

```int read_line(char str[], int n)
{
int ch, i = 0;

do {
ch = getchar();
if (i < n)
str[i++] = ch;
} while (ch != '\n');
str[i] = '\0';
return i;
}
```

(d)

```int read_line(char str[], int n)
{
int ch, i;

for (i = 0; i < n; i++) {
ch = getchar();
if (ch == '\n')
break;
str[i] = ch;
}
str[i] = '\0';
return i;
}
```

6. [was #6]

```void censor(char s[])
{
int i;

for (i = 0; s[i] != '\0'; i++)
if (s[i] == 'f' && s[i+1] == 'o' && s[i+2] =='o')
s[i] = s[i+1] = s[i+2] = 'x';
}
```

Note that the short-circuit evaluation of `&&` prevents the `if` statement from testing characters that follow the null character.

8. [was #10] `tired-or-wired?`

10. [was #12] The value of `q` is undefined, so the call of `strcpy` attempts to copy the string pointed to by `p` into some unknown area of memory. Exercise 2 in Chapter 17 discusses how to write this function correctly.

15. [was #8]

(a) 3
(b) 0
(c) The length of the longest prefix of the string `s` that consists entirely of characters from the string `t`. Or, equivalently, the position of the first character in `s` that is not also in `t`.

16. [was #16]

```int count_spaces(const char *s)
{
int count = 0;

while (*s)
if (*s++ == ' ')
count++;
return count;
}
```

#### Answers to Selected Programming Projects

1. [was #14]

```#include <stdio.h>
#include <string.h>

#define WORD_LEN 20

int main(void)
{
char smallest_word[WORD_LEN+1],
largest_word[WORD_LEN+1],
current_word[WORD_LEN+1];

printf("Enter word: ");
strcpy(smallest_word, strcpy(largest_word, current_word));

while (strlen(current_word) != 4) {
printf("Enter word: ");
if (strcmp(current_word, smallest_word) < 0)
strcpy(smallest_word, current_word);
if (strcmp(current_word, largest_word) > 0)
strcpy(largest_word, current_word);
}

printf("\nSmallest word: %s\n", smallest_word);
printf("Largest word: %s\n", largest_word);

return 0;
}

{
int ch, i = 0;

while ((ch = getchar()) != '\n')
if (i < n)
str[i++] = ch;
str[i] = '\0';
}
```

4. [was #18]

```#include <stdio.h>

int main(int argc, char *argv[])
{
int i;

for (i = argc - 1; i > 0; i--)
printf("%s ", argv[i]);
printf("\n");

return 0;
}
```

6. [was #20]

```#include <ctype.h>
#include <stdio.h>
#include <string.h>

#define NUM_PLANETS 9

int string_equal(const char *s, const char *t);

int main(int argc, char *argv[])
{
char *planets[] = {"Mercury", "Venus", "Earth",
"Mars", "Jupiter", "Saturn",
"Uranus", "Neptune", "Pluto"};
int i, j;

for (i = 1; i < argc; i++) {
for (j = 0; j < NUM_PLANETS; j++)
if (string_equal(argv[i], planets[j])) {
printf("%s is planet %d\n", argv[i], j + 1);
break;
}
if (j == NUM_PLANETS)
printf("%s is not a planet\n", argv[i]);
}

return 0;
}

int string_equal(const char *s, const char *t)
{
int i;

for (i = 0; toupper(s[i]) == toupper(t[i]); i++)
if (s[i] == '\0')
return 1;

return 0;
}
```