while(gets(choice) != NULL && choice[0] != '\0')求教

今天看了一下枚举,但是这一句代码我看不懂,不知道为什么敲了个回车就可以结束循环了。希望各位可以帮我解答一下这个疑问。代码我是在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),具体原因百度上应该就可以找到。个人观点,如有错误还望指正,祝好~