| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 956 人关注过本帖, 1 人收藏
标题:麻烦帮我看下代码有什么问题,执行的时候好象限入死循环
只看楼主 加入收藏
jasjac
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-3-24
收藏(1)
 问题点数:0 回复次数:9 
麻烦帮我看下代码有什么问题,执行的时候好象限入死循环
新手,麻烦帮我看下,在线等待
#include<stdio.h>
#include <conio.h>

int i,j,k,n,m,l,u,a[10];
char b[10];
int temp;
char come;

void inputnameandjobnum()
{
    printf("please input name and job num:");
    for(u=0;u<10;u++)
    {
        scanf("%c,%d\n",&b[u],&a[u]);
    }


}

maxtominnum()
{

    for(n=0;n<9;m++)
    for(i=0;i<9-m;i++)
    {
        if(a[i]<a[i+1])
        {
            temp=a[i];
            a[i]=a[i+1];
            a[i+1]=temp;

        /*    come=b[i];
            b[i]=b[i+1];
            b[i+1]=come;*/

        }
        else
        {
            a[i]=a[i];
            //b[i]=b[i];
        }
    }
return a[i]/*,b[i]*/;
}

maxtominname()
{
    for(l=0;l<9;l++)
    for(n=0;n<9-l;n++)
    {
        if(a[n]<a[n+1])
        {

            come=b[n];
            b[n]=b[n+1];
            b[n+1]=come;

        }
        else
        {
            b[n]=b[n];
        }
    }
return b[n];
}


void main()
{
    int aa[10];
    char bb[10];

    inputnameandjobnum();
    aa[k]=maxtominnum();
    bb[k]=maxtominname();
    for(k=0;k<10;k++)
    {
        printf("name=%c,num=%d\n",bb[k],aa[k]);
    }
    getch();

}
搜索更多相关主题的帖子: 象限 temp 麻烦 come 代码 
2008-04-25 07:15
jasjac
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-3-24
收藏
得分:0 
搞错了,在发
#include<stdio.h>
#include <conio.h>

int i,j,k,n,m,l,u,a[10];
char b[10];
int temp;
char come;

void inputnameandjobnum()
{
    printf("please input name and job num:");
    for(u=0;u<10;u++)
    {
        scanf("%c,%d\n",&b[u],&a[u]);
    }


}

maxtominnum()
{

    for(m=0;m<9;m++)
    for(i=0;i<9-m;i++)
    {
        if(a[i]<a[i+1])
        {
            temp=a[i];
            a[i]=a[i+1];
            a[i+1]=temp;

        /*    come=b[i];
            b[i]=b[i+1];
            b[i+1]=come;*/

        }
        else
        {
            a[i]=a[i];
            //b[i]=b[i];
        }
    }
return a[i]/*,b[i]*/;
}

maxtominname()
{
    for(l=0;l<9;l++)
    for(n=0;n<9-l;n++)
    {
        if(a[n]<a[n+1])
        {

            come=b[n];
            b[n]=b[n+1];
            b[n+1]=come;

        }
        else
        {
            b[n]=b[n];
        }
    }
return b[n];
}


void main()
{
    int aa[10];
    char bb[10];

    inputnameandjobnum();
    aa[k]=maxtominnum();
    bb[k]=maxtominname();
    for(k=0;k<10;k++)
    {
        printf("name=%c,num=%d\n",bb[k],aa[k]);
    }
    getch();

}
2008-04-25 07:16
DoNO1
Rank: 1
等 级:新手上路
帖 子:155
专家分:0
注 册:2008-3-27
收藏
得分:0 
输入有误码
for(u=0;u<10;u++)
    {
        scanf("%c,%d\n",&b[u],&a[u]);
    }
应改为
for(u=0;u<10;u++)
    {
        scanf("%d\n",&a[u]);
        fflush(stdin);
        scanf("%c\n",&b[u],&a[u]);
    }
2008-04-25 08:31
jasjac
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-3-24
收藏
得分:0 
回复 3# 的帖子
麻烦解释一下,谢谢!
2008-04-25 09:13
jasjac
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-3-24
收藏
得分:0 
回复 4# 的帖子
C语言里我们经常使用getchar()来获得字符输入,但回车这个字符很特殊,它实际上包含两个字符,这就导致:我们要求输入两个字符时,先输入一个字符,回车,再输入一个字符,那么,第二个getchar()获得的实际上是回车的第二个字符。因此,在getchar()之前,要用fflush(stdin);清除一下缓冲区,把回车的第二个字符清除掉
找到了,谢谢你!
2008-04-25 09:16
jasjac
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-3-24
收藏
得分:0 
由晴空输入流引伸的一些定义!
OpenGL学习资源
 
字号: 大大  中中  小小 清空输入流
1.       为什么 fflush(stdin) 是错的

 

首先请看以下程序:

 

                   #include <stdio.h>

 

int main( void )

{

    int i;

    for (;;) {

        fputs("Please input an integer: ", stdout);

        scanf("%d", &i);

        printf("%d\n", i);

    }

    return 0;

}

 

这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。

 

也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义:

 

int fflush(FILE *stream);

 

如果 stream 指向输出流或者更新流(update stream),并且这个更新流
最近执行的操作不是输入,那么 fflush 函数将把这个流中任何待写数据传送至
宿主环境(host environment)写入文件。否则,它的行为是未定义的。

原文如下:


int fflush(FILE *stream);



If stream points to an output stream or an update stream in which
the most recent operation was not input, the fflush function causes
any unwritten data for that stream to be delivered to the host environment
to be written to the file; otherwise, the behavior is undefined.

 

其中,宿主环境可以理解为操作系统或内核等。

 

    由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin)  是不正确的,至少是移植性不好的。

 

 

2.       清空输入缓冲区的方法

 

 虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。

        /* C 版本 */
        #include <stdio.h>


        int main( void )
        {
            int i, c;
              for ( ; ; )
            {
                fputs("Please input an integer: ", stdout);
                scanf("%d", &i);

             if ( feof(stdin) || ferror(stdin) )
                { /* 如果用户输入文件结束标志(或文件已被读完), */
                  /* 或者发生读写错误,则退出循环               */
            
                    /* do something */
                    break;
                }
                /* 没有发生错误,清空输入流。                 */
                /* 通过 while 循环把输入流中的余留数据“吃”掉 */
                while ( (c = getchar()) != '\n' && c != EOF ) ;
                /* 使用 scanf("%*[^\n]"); 也可以清空输入流, */

               /* 不过会残留 \n 字符。                          */

               printf("%d\n", i);
            }

             return 0;
        }


        /* C++ 版本 */
        #include <iostream>
        #include <limits> // 为了使用numeric_limits
 

     using std::cout;
        using std::endl;
        using std::cin;
        using std::numeric_limits;
        using std::streamsize;
 

     int main()
        {
            int value;
            for ( ; ; )
            {
                cout << "Enter an integer: ";
                cin >> value;
                if ( cin.eof() || cin.bad() )
                { // 如果用户输入文件结束标志(或文件已被读完),
                  // 或者发生读写错误,则退出循环



                 // do something
                    break;
                }
                // 读到非法字符后,输入流将处于出错状态,
                // 为了继续获取输入,首先要调用 clear 函数
                // 来清除输入流的错误标记,然后才能调用
                // ignore 函数来清除输入流中的数据。
                cin.clear();
                // numeric_limits<streamsize>::max() 返回输入缓冲的大小。
                // ignore 函数在此将把输入流中的数据清空。
                // 这两个函数的具体用法请读者自行查询。
                cin.ignore( numeric_limits<streamsize>::max(), '\n' );

                cout << value << '\n';
            }



         return 0;
        }
2008-04-25 09:30
jasjac
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2008-3-24
收藏
得分:0 
还是不行
2008-04-25 22:45
nobush
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2008-1-10
收藏
得分:0 
首先,一要说明你这个程序是干什么的?

关于输入:
scanf("%c,%d\n" 表示你要按照
a,1回车
b,2回车
c,123回车
这样的格式输入~即必须是逗号跟随字符后面,否则读入就不正确

你程序最大的问题在于:
 aa[k]=maxtominnum(); //这三句在做什么?该不是想要对数组赋值吧?
 bb[k]=maxtominname();
    for(k=0;k<10;k++)
    {
        printf("name=%c,num=%d\n",bb[k],aa[k]);
    }
2008-04-25 23:52
nobush
Rank: 1
等 级:新手上路
帖 子:71
专家分:0
注 册:2008-1-10
收藏
得分:0 
建议把scanf("%c,%d\n" 中的\n去掉,改用fflush,不去掉也行,只是多输入一行
然后自己改主程序

[[it] 本帖最后由 nobush 于 2008-4-25 17:59 编辑 [/it]]
2008-04-25 23:56
DoNO1
Rank: 1
等 级:新手上路
帖 子:155
专家分:0
注 册:2008-3-27
收藏
得分:0 
顶顶顶顶顶顶顶顶顶顶顶顶
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
2008-05-02 22:48
快速回复:麻烦帮我看下代码有什么问题,执行的时候好象限入死循环
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034488 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved