Linux第一课:c语言 学习记录day03

二、基础内容

4、输入输出

函数三要素:功能,参数,返回值

4.1、按格式输入输出

4.1.1、按格式输出

printf

        man 3 printf

#include <stdio.h>
int printf(const char *format, ...);

功能:按照指定格式向终端输出

#include<stido.h>
int main()
{
    //按格式输出,格式匹配
    int a = 10;
    printf("a=%d\n", a);
    float b = 1.1;
    printf("b=%d\n",b); 
    printf("b=%f\n",b); 
    printf("a=%d    b=%f\n",a,b);
    return 0;
}

程序运行结果如下:

d711dd6f7b144794813d3127eb935610.png

        变量b是单精度浮点型数据,printf一个整型数据,计算机会将变量b按照浮点型数据转化成二进制数据储存,然后以整型数据的输出过程转化成整型输出出来。所以要注意格式匹配,在这种情况下,计算机会给与一个警告,需要注意。

格式:

%dint整型
%ldlong长整型
%lllong long长长整型
%hdshort短整型
%cchar字符型
%ffloat单精度浮点型
%lfdouble双精度浮点型
%s字符串
%i十进制
%o八进制
%x十六进制
%uunsinged int无符号十进制整型
%p地址
%e指数

注意:%-m.n:

        -:输出内容左对齐,默认是右对齐

        m:位宽、

        .n:保留小数位数

参数:format:字符串:“hello world”

#include<stdio.h>
int main()
{
    //formant:字符串
    printf("hello world\n");
    return 0;
}

        format里面实际上是字符串

返回值:由int确定,printf的返回值是输出字符的个数

#include<stdio.h>
int main()
{
    //返回值
    int ret1 = printf("hello world\n"); 
    int ret2 = printf("hello world");
    int ret3 = printf("\nret1=%d\n",ret1);
    printf("ret2=%d\n",ret2);
    printf("ret 3 = %d\n",ret3);
    return 0;
}

程序运行结果如下:

82b34047ed684c25aa5a05844c5ef4c6.png

ret2只有11个,比ret1少了个\n,所以printf的返回值不计算\0,但是计算\n。

ret3为9,所以%和d算2个字符。

4.1.2、按格式输入

scanf

        man 3 scanf

#include <stdio.h>
int scanf(const char *format, ...);

功能:按格式输入

#include<stdio.h>
int main()
{    
    //按格式输入
    int a, b;
    printf("a=%d  b=%d\n",a,b); //a=0   b=0
    scanf("%d   %d",&a,&b);
    printf("a=%d  b=%d\n",a,b); 
    //功能性格式不要加
    float c;
    scanf("%f",&c);    //-m.n
    printf("c=%f\n",c);
    return 0;
}

参数:同printf

返回值:正确输入的数据个数

#inculde<stdio.h>
int main()
{
    //返回值
    int ret = scanf("%d   %d",&a,&b);
    printf("ret = %d\n",ret);
    return 0;
}

当第一个数据输入格式不正确时,scanf会直接中断,后面的数据不会输入

4.2、按字符输入输出

4.2.1、按字符输入—getchar

        man 3 getchar

#include<stdio.h>
int getchar(void);

三要素:

        功能:从终端输入一个字符

        参数:void,空

        返回值:输入字符的ASCII码

使用:

 int ascii = getchar();
printf("%c\n", ascii);

4.2.2、按字符输出—putchar

        man 3 putchar

#include<stdio.h>
int putchar(int c);

三要素:

        功能:向终端输出一个字符

        参数:要输出的字符的ASCII码

        返回值:要输出的字符的ASCII码

使用:

    int ascii = getchar();
    putchar(ascii);

用getchar、putchar实现大小写字母转换并排除错误

#include<stdio.h>
int main()
{
    int get = getchar();
    if ( get>=65 && get<=90 )
    {
        putchar(get+32);
        putchar('\n');
    }
    else if ( get >= 97 && get <= 122 )
    {
        putchar(get-32);
        putchar('\n');
    }
    else
    {
        printf("no\n");
    }
    return 0;
}

4.2.3、字符回收

#include<stdio.h>
int main()
{
    char a, ch;
    scanf( "%c%c", &a, &ch);
    printf( "a=%c    ch=%c\n", a, ch);
    return 0;
}

运行结果如下:

0df3530448c24aa6812b621f4f76edf0.png

可见,输入ab时,a给到a,b给到ch,输出没有问题;但是当按照正常输入逻辑,输入a b时,a照常给到a,但是此时‘ ’给到了ch,输入的b消失了,此时,输入的空格就是垃圾字符,需要想办法回收。

三种方法:空格、%*c、gatchar()

1、空格:    scanf( "%c %c", &a, &ch);

#include<stdio.h>
int main()
{
    char a, ch;
    scanf("%c %c", &a, &ch);
    printf("a=%c    ch=%c\n", a, ch);
    return 0;
}

运行结果如下:

61288a67109c4a618b298123072ff64e.png

可见,在scanf中的%c之间加上空格之后,这个空格可以回收分隔符,即空格,tab,回车。

优点:可以回收所有的分隔符,不限数量

缺点:只能回收分隔符

2、%*c:    scanf( "%c%*c%c", &a, &ch);

#include<stdio.h>
int main()
{
    char a, ch;
    scanf("%c%*c%c", &a, &ch);
    printf("a=%c    ch=%c\n", a, ch);
    return 0;
}

运行结果如下:

47ff2385fe8c473cb232aa2bb9e2811b.png

优点:%*c可以回收所有字符

缺点:只能回收一个

3、getchar():

一个死循环,来验证gatchar的作用

#include<stdio.h>
int main()
{
    char ch;
    int b = 0;
    while(1)
    {
        scanf("%c", &ch);
        getchar();
        printf("%c", ch);
        b++;
        printf("%d\n", b);
    }
    return 0;
}

当没有getchar时:

9276a7e4777e41b9a3faceb842142cc4.png

输入的字符实际上输入的是a和回车,ch只能接受一个字符,回车就进入暂存,输出一个a后,b自加变成1,跟在a后面输出,执行\n后进入第二次循环,ch优先从暂存接受数据所以第二次循环先输出一个回车,b再次自加,变成2,跟在回车后面打印输出2,然后打印\n。

当getchar存在时:

35baffb52b9442e5afc330ecd0b00839.png

输入的字符还是a和回车,ch接受一个字符后,回车被getchar接受,打印输出时只输出ch的a,紧跟着是b的自加变成1和\n第一次循环结束,暂存里面没有东西不会进入下一次循环

三、语句

1、分支语句

根据不同条件,执行不同的语句

1.1、if

1.1.1、分支

结构如下:

ccf22fc79f4c4abcbb06450f01ce58c2.jpeg

 if(表达式)
{
        语句块1;
}
else
{
        语句块2;
}

表达式1成立,执行语句块1,表达式1不成立,执行语句块2

示例如下:

#include<stdio.h>
int main()
{  
    int a;
    scanf("%d",&a);
    if (a>10)
    {
        printf("OK\n");
    }
    else
    {
        printf("NO\n");
    }
    return 0;
}

用法:
if后面可以没有else,但是else前面必须有if

#include<stdio.h>
int main()
{  
    int a;
    scanf("%d",&a);
    if (a>10)
    {
        printf("OK\n");
    }
    return 0;
}

if的大括号可以删掉,但是只能匹配一条语句

#include<stdio.h>
int main()
{  
    int a;
    scanf("%d",&a);
    if (a>10)
    printf("OK\n");
    else
    printf("NO\n");
    return 0;
}

1.1.2、分层

结构如下

06aea7cb3186476fa18e02e3990fec28.jpeg

if(表达式)
{
        语句块1;
}
else if(表达式2)
{
        语句块2;
}
else if(表达式3)
{
        语句块3;
}
else
{
        语句块4;
}

示例如下:

#include<stdio.h>
int main()
{
    int a;
    scanf("%d",&a);
    if (a>=10 && a<=20)
    {
        printf("10<%d<20\n",a);
    }
    else if (a<10)
    {
        printf("<10\n");
    }
    else
    {
        printf(">20\n");
    }
    return 0;
}

1.1.3、嵌套

结构如下
89a48c690e94465ba16799ef60fdf984.jpeg

if(表达式1)
{
        if(表达式2)
        {
                语句块1;
        }
        else
        {
                语句块2;
        }

}
else
{
        if(表达式2)
        {
                语句块3;
        }
        else
        {
                语句块4;
        }
}

示例如下:

输入三个整数,按照从大到小排列:

#include<stdio.h>
int main(int argc, char const *argv[])
{
    int num1, num2, num3;
    int max, mid, min;
    scanf ( "%d %d %d", & num1, & num2, & num3);
    if ( num1 > num2 )
    {
        if ( num1 > num3)
        {
            max = num1;
            if ( num2 > num3)
            {
                mid = num2;
                min = num3;
            }
            else
            {
                mid = num3;
                min = num2;
            }
        }
        else
        {
            max = num3;
            mid = num1;
            min = num2;
        }
    }
    else    //1 < 2
    {
        if ( num2 > num3)   //1 < 2, 2 > 3
        {
            max = num2;
            if ( num1 > num3)   //2 > 1 > 3
            {
                mid = num1;
                min = num3;
            }
            else    //2 > 3 >1
            {
                mid = num3;
                min = num1;
            }
        }
        else    //1 < 2, 2 < 3
        {
            max = num3;
            mid = num2;
            min = num1;
        }
    }
    printf ( "%d > %d > %d\n", max, mid, min);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值