printf和scanf返回值的研究及EOF的使用(多组输入)

一、printf和scanf返回值

在学习中我们知道,scanf()和printf()为库函数,函数一般都有返回值,在这里我们先研究研究scanf()这个函数的返回值

打开cplusplus这个网站,搜索scanf这个函数发现声明为(网址为:https://cplusplus.com/

int scanf ( const char * format, ... );

知道scanf函数的返回值为int

那么我们输入以下代码进行测试

#include<stdio.h>
int main()
{
	int a;
	printf("%d\n", scanf("%d", &a));

	int b;
	printf("%d\n", scanf("%d %d", &a,&b));

	int c;
	printf("%d\n", scanf("%d %d %d", &a, &b,&c));
	return 0;
}

运行上述代码,可发现输出依次为1 2 3

即可知道scanf的返回值为输入的个数

同理我们寻找printf函数的返回值

int printf ( const char * format, ... );
#include<stdio.h>
int main()
{
	int a = 0;
	a = printf("abcdefg");
	printf("\n%d\n", a);

	a = printf("\n");
	printf("%d\n", a);

	a = printf("1234567\8\9");
	printf("\n%d\n", a);


	return 0;
}

根据输出为

abcdefg
7

1
123456789
9

我们不难发现printf函数返回值为输出字符串的个数

二、多组输入

先给大家一个示范题目

链接:三角形判断__牛客网
来源:牛客网

输入描述:

题目有多组输入数据,每一行输入三个a,b,c(0<a,b,c<1000),作为三角形的三个边,用空格分隔。

输出描述:
针对每组输入数据,输出占一行,如果能构成三角形,等边三角形则输出“Equilateral triangle!”,等腰三角形则输出“Isosceles triangle!”,其余的三角形则输出“Ordinary triangle!”,反之输出“Not a triangle!”。

题目要求多组输入,共有三种方法

1、while(scanf()!=EOF)

#include<stdio.h>
int main()
{
    int a = 0, b = 0, c = 0;
    while (scanf("%d %d %d", &a, &b, &c) != EOF)//关键点
    {
        if (a + b > c && a + c > b && b + c > a)
        {
            if (a == b && b == c)
            {
                printf("Equilateral triangle!\n");
            }
            else if (a == b || b == c || a == c)
            {
                printf("Isosceles triangle!\n");
            }
            else
            {
                printf("Ordinary triangle!\n");
            }
        }
        else
        {
            printf("Not a triangle!\n");
        }
    }
    return 0;
}

我们右键EOF转到声明

发现 其声明如下

 即EOF为(-1)

此时思考不难发现,scanf的返回值为输入的个数,在while循环中

scanf("%d %d %d", &a, &b, &c) != EOF

可让输入为条件,只要输入正常,便可以进行多组输入

补充:结束一般使用ctrl+z

2、while(~scanf())

#include<stdio.h>
int main()
{
    int a = 0, b = 0, c = 0;
    while (~scanf("%d %d %d", &a, &b, &c))//关键点
    {
        if (a + b > c && a + c > b && b + c > a)
        {
            if (a == b && b == c)
            {
                printf("Equilateral triangle!\n");
            }
            else if (a == b || b == c || a == c)
            {
                printf("Isosceles triangle!\n");
            }
            else
            {
                printf("Ordinary triangle!\n");
            }
        }
        else
        {
            printf("Not a triangle!\n");
        }
    }
    return 0;
}

'~'符号为按位取反

只要在scanf的返回值为-1的情况下才会结束

因为-1的补码为11111111 11111111 11111111 11111111

按位取反为00000000 00000000 00000000 00000000

此时才会结束

3、while(scanf()==3)

#include<stdio.h>
int main()
{
    int a = 0, b = 0, c = 0;
    while (scanf("%d %d %d", &a, &b, &c)==3)//关键点
    {
        if (a + b > c && a + c > b && b + c > a)
        {
            if (a == b && b == c)
            {
                printf("Equilateral triangle!\n");
            }
            else if (a == b || b == c || a == c)
            {
                printf("Isosceles triangle!\n");
            }
            else
            {
                printf("Ordinary triangle!\n");
            }
        }
        else
        {
            printf("Not a triangle!\n");
        }
    }
    return 0;
}

原因同上,均是利用了scanf返回值的方法

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值