Q: Is there a way to switch on strings?
A: Not directly. Sometimes, it's appropriate to use a separate function to map strings to integer codes, and then switch on those:
#define CODE_APPLE	1
#define CODE_ORANGE	2
#define CODE_NONE	0
switch(classifyfunc(string)) {
	case CODE_APPLE:
		...
	case CODE_ORANGE:
		...
	case CODE_NONE:
		...
}
where classifyfunc looks something like
static struct lookuptab {
	char *string;
	int code;
} tab[] = {
	{"apple",	CODE_APPLE},
	{"orange",	CODE_ORANGE},
};
classifyfunc(char *string)
{
	int i;
	for(i = 0; i < sizeof(tab) / sizeof(tab[0]); i++)
		if(strcmp(tab[i].string, string) == 0)
			return tab[i].code;
	return CODE_NONE;
}
Otherwise, of course, you can fall back on a conventional if/else chain:
	if(strcmp(string, "apple") == 0) {
		...
	} else if(strcmp(string, "orange") == 0) {
		...
	}
(A macro like
Streq()
from question 17.3
can make these comparisons a bit more convenient.)
See also questions 10.12, 20.16, 20.18, and 20.29.
References:
K&R1 Sec. 3.4 p. 55
K&R2 Sec. 3.4 p. 58
ISO Sec. 6.6.4.2
H&S Sec. 8.7 p. 248