鱼C论坛

 找回密码
 立即注册
查看: 6405|回复: 28

用scanf陷入死循环了怎么破,求助~!!!

[复制链接]
发表于 2013-4-20 22:12:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 绝尘の初 于 2013-4-20 22:13 编辑

一个投票的程序~--------------------------------------------------

#include<stdio.h>
#define FR for(i=1;i<=10;i++)
#define PRT(j,k) printf("j的票数为%d",k)
struct houxuanren
{
    int num;   
};                                    \\候选人结构体
int main()
{
    void toupiao();
    toupiao();            \\投票函数
    getch();   
}
void toupiao()
{
struct houxuanren a[4]={{0},{0},{0},{0}};         \\候选人结构体数组      
    int i;                                                             \\循环控制
    char hxr;                                                           
    void mx(struct houxuanren a[],int n);                    \\比较票数函数
    printf("欢迎进入投票系统\n\n候选人名单有:a,b,c,d\n\n");
    FR
    {
        printf("第%d票为:",i);
        scanf("%s",&hxr);                                
     
       \\问题就在这,这里用%s的话,只输入一个字符时,i就变成永远是1,也就是无限循环下去了,而输入二个字符以上时退出循环,什么原因?以及如果改成%c,则循环方面没有问题,但是第一次循环输入一个字符后,第二次循环就会自动将'\0'赋值给hxr,导致第二票自动作废                其它地方没有问题了,就是这里百思不得其解,原因是什么?
        if(hxr=='a')
        {
        a[0].num++;
        continue;
        }
        else if(hxr=='b')
        {
        a[1].num++;
        continue;
        }
        else if(hxr=='c')
        {
        a[2].num++;
        continue;
        }
        else if(hxr=='d')
        {
        a[3].num++;
        continue;   
        }
        else
        {
        printf("\n作废\n");
        continue;
        }
    }
    printf("a的票数为%d\n",a[0].num);
    printf("b的票数为%d\n",a[1].num);
    printf("c的票数为%d\n",a[2].num);
    printf("d的票数为%d\n",a[3].num);
    printf("成功入选的是:");
    mx(a,4);
}
void mx(struct houxuanren a[],int n)                                         \\比较票数
{
    char max;
    if(a[0].num>=a[1].num&&a[0].num>=a[2].num&&a[0].num>=a[3].num)
        max='a';
    else if(a[1].num>=a[0].num&&a[1].num>=a[2].num&&a[1].num>=a[3].num)
        max='b';
    else if(a[2].num>=a[0].num&&a[2].num>=a[1].num&&a[2].num>=a[3].num)
        max='c';            
    else if(a[3].num>=a[0].num&&a[3].num>=a[1].num&&a[3].num>=a[2].num)
        max='d';   
    printf("%c",max);
}

-------------------------------------------------------------------------------------------
还有
在宏定义里
#define PRT(j,k) printf("j的票数为%d",k)

这个j被认定为字符串的一部分,而不是参数
该怎么改?

------------------------------------------------------------------------------------------------------------------
调试了一下发现要把hxr定义为hxr[2]才行,问题已经解决了,但是不明白原因
想了下也就是hxr要把\0也接收到才行
那和循环又有什么关系呢?



小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-20 22:35:39 | 显示全部楼层
char hxr;     赋值要用scanf("%c")吧, 是字符串时才用%s
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-21 10:46:25 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-21 10:59:30 | 显示全部楼层
帮楼主顶一下,嘿嘿!
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-21 11:04:08 | 显示全部楼层
diouf3 发表于 2013-4-21 10:59
帮楼主顶一下,嘿嘿!

呵呵,总之谢谢
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-21 15:03:45 | 显示全部楼层
自挂东南枝

求人撒
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-21 16:35:02 | 显示全部楼层
自顶,求人啦
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-21 17:03:18 | 显示全部楼层
无回帖,不论坛,这才是人道。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-22 22:30:21 | 显示全部楼层
继续自顶,没人吗
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 08:34:19 | 显示全部楼层
1.你的注释用错了//
2.getchar()不是getch()
更改后 通过   
#include<stdio.h>
#define FR for(i=1;i<=10;i++)
#define PRT(j,k) printf("j的票数为%d",k)
struct houxuanren
{
    int num;   
};                                    //候选人结构体
int main()
{
    void toupiao();
    toupiao();            //投票函数
    getchar();   
}
void toupiao()
{
struct houxuanren a[4]={{0},{0},{0},{0}};         //候选人结构体数组      
    int i;                                                             //循环控制
    char hxr;                                                           
    void mx(struct houxuanren a[],int n);                    //比较票数函数
    printf("欢迎进入投票系统\n\n候选人名单有:a,b,c,d\n\n");
    FR
    {
        printf("第%d票为:",i);
        scanf("%s",&hxr);                                
           //问题就在这,
        if(hxr=='a')
        {
        a[0].num++;
        continue;
        }
        else if(hxr=='b')
        {
        a[1].num++;
        continue;
        }
        else if(hxr=='c')
        {
        a[2].num++;
        continue;
        }
        else if(hxr=='d')
        {
        a[3].num++;
        continue;   
        }
        else
        {
        printf("\n作废\n");
        continue;
        }
    }
    printf("a的票数为%d\n",a[0].num);
    printf("b的票数为%d\n",a[1].num);
    printf("c的票数为%d\n",a[2].num);
    printf("d的票数为%d\n",a[3].num);
    printf("成功入选的是:");
    mx(a,4);
}
void mx(struct houxuanren a[],int n)                                         //比较票数
{
    char max;
    if(a[0].num>=a[1].num&&a[0].num>=a[2].num&&a[0].num>=a[3].num)
        max='a';
    else if(a[1].num>=a[0].num&&a[1].num>=a[2].num&&a[1].num>=a[3].num)
        max='b';
    else if(a[2].num>=a[0].num&&a[2].num>=a[1].num&&a[2].num>=a[3].num)
        max='c';            
    else if(a[3].num>=a[0].num&&a[3].num>=a[1].num&&a[3].num>=a[2].num)
        max='d';   
    printf("%c",max);
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 09:00:49 | 显示全部楼层
wjb8love_9c7c9c 发表于 2013-4-23 08:34
1.你的注释用错了//
2.getchar()不是getch()
更改后 通过   

不能用 %s
char 用 %c
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 09:02:25 | 显示全部楼层
楼主 有 " %c"注意 %c前面有一个空格
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 10:09:46 | 显示全部楼层
本帖最后由 wjb8love_9c7c9c 于 2013-4-23 10:10 编辑
我是师兄 发表于 2013-4-23 09:00
不能用 %s
char 用 %c


经检验,可以通过vc6.0
如果非要用%c,也可以,但必须接一句getchar()

如下,vc6.0通过
#include<stdio.h>
#define FR for(i=1;i<=10;i++)
#define PRT(j,k) printf("j的票数为%d",k)
struct houxuanren
{
    int num;   
};                                    //候选人结构体
int main()
{
    void toupiao();
    toupiao();            //投票函数
    getchar();   
}
void toupiao()
{
struct houxuanren a[4]={{0},{0},{0},{0}};         //候选人结构体数组      
    int i;                                                             //循环控制
    char hxr;                                                           
    void mx(struct houxuanren a[],int n);                    //比较票数函数
    printf("欢迎进入投票系统\n\n候选人名单有:a,b,c,d\n\n");
    FR
    {
        printf("第%d票为:",i);
        scanf("%c",&hxr);
                getchar();//就是这里,得接一句,否则就出问题。
           //问题就在这,
        if(hxr=='a')
        {
        a[0].num++;
        continue;
        }
        else if(hxr=='b')
        {
        a[1].num++;
        continue;
        }
        else if(hxr=='c')
        {
        a[2].num++;
        continue;
        }
        else if(hxr=='d')
        {
        a[3].num++;
        continue;   
        }
        else
        {
        printf("\n作废\n");
        continue;
        }
    }
    printf("a的票数为%d\n",a[0].num);
    printf("b的票数为%d\n",a[1].num);
    printf("c的票数为%d\n",a[2].num);
    printf("d的票数为%d\n",a[3].num);
    printf("成功入选的是:");
    mx(a,4);
}
void mx(struct houxuanren a[],int n)                                         //比较票数
{
    char max;
    if(a[0].num>=a[1].num&&a[0].num>=a[2].num&&a[0].num>=a[3].num)
        max='a';
    else if(a[1].num>=a[0].num&&a[1].num>=a[2].num&&a[1].num>=a[3].num)
        max='b';
    else if(a[2].num>=a[0].num&&a[2].num>=a[1].num&&a[2].num>=a[3].num)
        max='c';            
    else if(a[3].num>=a[0].num&&a[3].num>=a[1].num&&a[3].num>=a[2].num)
        max='d';   
    printf("%c",max);
}

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 10:32:41 | 显示全部楼层
wjb8love_9c7c9c 发表于 2013-4-23 10:09
经检验,可以通过vc6.0
如果非要用%c,也可以,但必须接一句getchar()

说了 用带空格的 " %c"
非要自找麻烦
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 10:45:35 | 显示全部楼层
我是师兄 发表于 2013-4-23 10:32
说了 用带空格的 " %c"
非要自找麻烦

解决问题的方法,有很多。试着用不同的方法去解决问题,能使自己进步,我没有说你的方法不对,但我给出的都是经过了检验的,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 10:47:49 | 显示全部楼层
wjb8love_9c7c9c 发表于 2013-4-23 10:45
解决问题的方法,有很多。试着用不同的方法去解决问题,能使自己进步,我没有说你的方法不对,但我给出的 ...

你的校验过了的 代码
输入 A[不小心多按了了一下空格][正常回车]
结果就出错了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 10:58:07 | 显示全部楼层
笑死我了,你可以再不小心的输入几个吧,看是不是你我给的方法都能出错呢,
这个程序没有对输入做检查。
这个问题的实际上是有字符在缓冲区的缘故,貌似是编译器本身的缘故,有好几个帖子都提到了,解决的方法都给出了。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 11:34:51 | 显示全部楼层
wjb8love_9c7c9c 发表于 2013-4-23 10:58
笑死我了,你可以再不小心的输入几个吧,看是不是你我给的方法都能出错呢,
这个程序没有对输入做检查。
...

东西学一半
半瓶水 就在晃荡了
stdin 缓冲区有残余数据
怎么解决你还没都弄明白
getchar....笑话
ababacd
acadcdc
这样的数据输入
getchar就跪了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-23 11:36:19 | 显示全部楼层
wjb8love_9c7c9c 发表于 2013-4-23 10:58
笑死我了,你可以再不小心的输入几个吧,看是不是你我给的方法都能出错呢,
这个程序没有对输入做检查。
...

我给的方式是什么意思你看得懂吗
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-4-23 17:37:54 | 显示全部楼层
我是师兄 发表于 2013-4-23 11:36
我给的方式是什么意思你看得懂吗

谢谢两位
总之是解决了
但是不大明白原理希望解释一下
还有为什么缓冲区的残余数据会对循环造成影响呢?
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-2 10:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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