今天看了一下枚举,但是这一句代码我看不懂,不知道为什么敲了个回车就可以结束循环了。希望各位可以帮我解答一下这个疑问。代码我是在C PRIMER PLUS上看到的
#include
#include
#include
enum spectrum {red, orange, yellow, green, blue, violet};
const char *colors[] = {"red","orange","yellow", "green", "blue", "violet"};
#define LEN 30
int main(void)
{
char choice [LEN];
enum spectrum color;
bool color_is_found = false;
puts("Enter a color (empty line to quit):");
while (gets(choice) != NULL && choice[0] != '\0')
{
for (color = red; color <= violet; color++)
{
if (strcmp(choice , colors[color]) == 0)
{
color_is_found = true;
break;
}
}
if (color_is_found)
switch (color)
{
case red: puts("Roses are red.");
break;
case orange: puts("Poppies are orange.");
break;
case yellow: puts("Sunflowers are yellow.");
break;
case green: puts("Grass are green.");
break;
case blue: puts("Bluebells are blue.");
break;
case violet: puts("Violets are violet.")
break;
}
else
printf ("I don't know about the color %s.\n",choice);
color_is_found = false;
puts("Next color, please (empty line to quit):");
}
puts("Bye!");
return 0;
你敲了回车之后,gets所到的字符为空,不满足while循环,所以跳出……
此句的代码的意思是,在没有输入空行的情况下(字符串首字符是‘\0‘则已经是空行)读取输入的整行字符串(choice字符串),包含空格。当输入回车时,程序读入的即为一个空行,空行是循环的停止条件。程序存在一点小问题,在switch的最后一个case语句没加分号,另外在dev c++中,color++貌似不能正常编译,需要强制类型转换,即color=(spectrum)(color+1),具体原因百度上应该就可以找到。个人观点,如有错误还望指正,祝好~