消息关闭
    暂无新消息!

循环语句中的if和while问题

问题作者 : 华记2017-08-17发布
#include<stdio.h>
int Gcd(int a, int b);
int main()
{
    int a = 0;
    int b = 0;
    int i = 1;
    int gcd = 1;
    int ret = 0;
    printf("Input a and b:\n");
    do
    {
        ret = scanf("%d%*c%d",&a,&b);
        if(ret == 0 || ret ==1 || a <= 0 || b <= 0)          //该句的判断为什么用if时,当输入有负数时为什么不能进行循环
        {                                                    //而用while时便可以在输入错误时进行循环输入?
            while(getchar() != '\n');
            printf("Input error!\nPlease input again!\n");
        }
        {
            Gcd(a, b);
        }
    }while(ret != 2);
}

int Gcd(int a, int b)    //求最大公约数
{
    int gcd = 0;
    int i = 0;
    if(a <= b)
    {
        gcd = a;
        for(i = gcd; i >= 0; i--)
        {
            if((a % i == 0)&&(b % i == 0))
            {
                printf("gcd = %d\n",i);
                break;
            }
        }
    }
    else
    {
        gcd = b;
        for(i = gcd; i >= 0; i--)
        {
            if((a % i == 0) && (b % i == 0))
            {
                printf("gcd = %d\n",i);
                break;
            }
        }
    }
}

6个回答

︿ 2
do
    {
        ret = scanf("%d%*c%d",&a,&b);
        if(ret == 0 || ret ==1 || a <= 0 || b <= 0)
        {                                                   
            while(getchar() != '\n');    /*注意这儿有分号*/
            printf("Input error!\nPlease input again!\n");
        }
        {
            Gcd(a, b);
        }
    }while(ret != 2); /*此处应该改成==,因为ret 等于2,因为输入10, -1之后ret为2*/

问题可能处在while判断条件上,注意上面代码的注释。
另外,Gcd函数没有返回值,根据函数类型是应该有返回值的。
︿ 2
#include<stdio.h>
int Gcd(int a, int b);
int main()
{
    int a = 0;
    int b = 0;
    int i = 1;
    int gcd = 1;
    int ret = 0;
    printf("Input a and b:\n");
    do
    {
        ret = scanf("%d%*c%d",&a,&b);
        if(ret == 0 || ret == 1 || a <= 0 || b <= 0)
        {
            while(getchar() != '\n');
            printf("Input error!\nPlease input again!\n");
        } else
        {
            gcd = Gcd(a, b);
            printf("gcd = %d\n", gcd);
        }
    }while(ret == 2);

    return 0;
}

int Gcd(int a, int b)    //求最大公约数
{
    int gcd = 0;
    int i = 0;
    if(a <= b)
    {
        gcd = a;
        for(i = gcd; i >= 0; i--)
        {
            if((a % i == 0)&&(b % i == 0))
            {
                printf("gcd = %d\n",i);
                break;
            }
        }
    }
    else
    {
        gcd = b;
        for(i = gcd; i >= 0; i--)
        {
            if((a % i == 0) && (b % i == 0))
            {
                printf("gcd = %d\n",i);
                break;
            }
        }
    }

    return gcd;
}
︿ 1
谢谢大家,刚学C,第一次发帖,很多不熟悉,看了好多回答,我自己吸收下,再次谢谢大家。
︿ 0
仅供参考:
#include <stdio.h>
int main()
{
    int a,b,n,v,r,k;
    char buf[80];
    char *p;

    k=0;
    r=EOF;
    while (1) {
        if (EOF==r) {
            fgets(buf,80,stdin);
            p=buf;
        }
        while (1) {
            r=sscanf(p,"%d%n",&v,&n);
            if (1==r) {k++;break;}
            if (EOF==r) break;
            p++;
        }
        if (EOF==r) continue;
        p+=n;
        if (1==k) a=v;
        if (2==k) {
            b=v;
            break;
        }
    }
    printf("%d,%d\n",a,b);
    return 0;
}

以上代码实现输入任意内容间隔的两个整数。
︿ 0

当用if时,运行时输入10    -1,则无法进行循环,而用while时则正常进行循环。
为什么啊?