QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 910|回复: 8

为什么这个程序要循环两次

[复制链接]
发表于 2004-8-27 18:52:37 | 显示全部楼层 |阅读模式
为什么以下程序要循环两次:

[code:1]#include<stdio.h>
#define BLACK "\33[;3m"
#define BLUE "\33[;34m"
#define CYAN "\33[;36m"
#define RED "\33[;31m"
#define PURPLE "\33[;35m"
#define YELLOW "\33[1;33m"

int main(void)
{
    int rec;
    rec=(int)NULL;
    printf("please choose which color you like:\n");
    printf("blAck, Blue, Cyan, Red, Purple, Yellow\n");
    while(!(rec=='A'||rec=='B'||rec=='C'||rec=='R'||rec=='P'||rec=='Y'))
    {
        fflush(stdin);
        while(rec<'a'||rec>'z'){
                printf("Please input a character between 'a' and 'z'\n");
                scanf("%c",&rec);
        }
        printf("Character you input is **%c**\n",rec);
        rec=toupper(rec);
        switch(rec)
        {
            case 'A' : printf(BLACK"Hello, world!\n");break;
            case 'B' : printf(BLUE"Hello, world!\n");break;
            case 'C' : printf(CYAN"Hello, world!\n");break;
            case 'R' : printf(RED"Hello, world!\n");break;
            case 'P' : printf(PURPLE"Hello, world!\n");break;
            case 'Y' : printf(YELLOW"Hello, world!\n");break;
            default  : printf("Sorry,but you have input an illegel character!\n");
        }
    }
    return ;
}[/code:1]

我想可能是getchar()的问题。例如第一次输入1<center>后就会出现输出两次Please input a character between 'a' and 'z'。请问这是什么原因?应该如何解决?谢谢。
发表于 2004-8-27 21:54:20 | 显示全部楼层
你的程序用的是scanf()而不是getchar()呀,怎会是getchar()的问题?

正确的做法应该是将 "printf("Please input a character between 'a' and 'z'\n");" 一行提出到第二个while循环的前边去。

另提一个意见,代码的缩进很乱,应认真改进。
回复

使用道具 举报

 楼主| 发表于 2004-8-28 14:10:17 | 显示全部楼层
哦。我弄错了。我用过getchar()和scanf()来做,却都是一样的输出。谢谢你提出的方法和意见。请问scanf()的工作机制是什么?为什么输入1<center>后会把第二个While循环执行两次。我想可能是这样的:第一次判断时因为输入是1所以就输出Please input a character between 'a' and 'z'。这个可以理解。但第二次循环根本不让我输入就输出Please input a character between 'a' and 'z'。我想可能是在输入1后输入了一个<center>的原因。后来我把输入字符一个一个显示出来,果然是这样的。我想请教这是什么原因?如何解决(如果不把"printf("Please input a character between 'a' and 'z'\n");" 一行提出到第二个while循环的前边去。)?谢谢。
回复

使用道具 举报

 楼主| 发表于 2004-8-28 17:04:19 | 显示全部楼层
我找到一个相关资料。有兴趣的可以看看,地址是  http://www.fdev.net/data/browse.asp?id=231  “通过防御性编程保护代码(可以解决部份问题)”
回复

使用道具 举报

发表于 2004-8-28 17:40:22 | 显示全部楼层
我帮你编辑了一下,在http之前加一个空格让别人可以直接从链接上过去(而不必再粘贴到地址栏中),并在后面加了文章的题目。
回复

使用道具 举报

 楼主| 发表于 2004-8-28 18:09:41 | 显示全部楼层
哦。谢谢。我已经解决了。问题的原因是scanf或getchar的数据溢出。解决的方法是限制接收的数据大小。具体代码如下:
scanf ("%1s", &rec);
回复

使用道具 举报

发表于 2004-9-3 23:30:23 | 显示全部楼层
输入11111用你的代码还有问题
回复

使用道具 举报

 楼主| 发表于 2004-9-4 14:48:14 | 显示全部楼层
是的,我也发现了。可以用一个字符串指针来接受scanf的数据,然后用把字符串指针的第一个字符符给一个字符变量。或者在scanf前用fflush(stdin);来洗空缓冲区,不过这样你如果是输入多于一个字符,程序会认为该字符串不属于字母。而用第一种方法只取输入字符串的第一个。
回复

使用道具 举报

发表于 2004-9-4 15:33:52 | 显示全部楼层
试试这个
int rec, tmpc;
rec = getchar();
while ((tmpc = getchar()) != 10);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 13:49 , Processed in 0.046264 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表