Die Funktion strcmp gibt 0 zurück, wenn die beiden Zeichenketten gleich sind. Wenn sie nicht gleich sind, gibt sie einen Wert ungleich 0 zurück. In deinem Code vergleichst du die Rückgabewerte von strcmp in den if-Bedingungen, und da 0 als false interpretiert wird, werden die Bedingungen immer wahr sein, es sei denn, strcmp gibt ungleich 0 zurück. Die Zeile
if (strcmp(str, "red"))
fragt eigentlich "ist str nicht red?" - also das Gegenteil von dam was du willst. Du willst fragen "ist str gleich red?". Hier ist eine korrigierte Version.
if (strcmp(str, "red") == 0) {
printf("1");
} else if (strcmp(str, "blue") == 0) {
printf("2");
} else if (strcmp(str, "green") == 0) {
printf("3");
} else {
printf("---");
}