L1D3 C语言输入输出专题

输入输出专题

一、输出函数

1.1字符输出函数 putchar()

在ubuntu下打开终端,通过man手册查找putchar,输入命令man 3 putchar可查看到关于putchar函数的用法及返回值。
在这里插入图片描述

格式:putchar(c)
参数:c为字符常量、变量或表达式
功能:把字符c输出到当前终端
返回值:正常为显示的代码值,错误返回EOF(-1)

tips:学习任何一个函数之前,可以先去编程验证一下这个函数。
用一个例子演示,代码及演示结果如下:

/*
 * @Description: 
 * @Author: 
 * @Date: 2022-06-30 20:02:53
 * @LastEditTime: 2022-06-30 20:05:27
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int c = 0;      // initial c   一切变量尽量初始化,避免不可预期错误
    char a = 0;
    c = 65;
    a = 'B';
    putchar(c);
    putchar('\n');
    putchar(a);
    putchar('\n');
    return 0;
}
//演示结果为在终端打印A B

在这里插入图片描述

1.2格式输出函数 printf

通过man手册查询printf的描述、参数及返回值。在终端下输入命令:man 3 printf

格式:printf("格式控制串",输出表)
功能:按指定格式向显示器输出数据
输出表:要输出的数据
#常用格式说明符:%d %s %x %u %o %f %e %g

修饰字符:
在这里插入图片描述
用几个例子演示格式输出函数,代码及演示结果如下:

/*
 * @Description: 
 * @Author: 余红祥
 * @Date: 2022-06-30 21:20:40
 * @LastEditTime: 2022-06-30 21:21:50
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a = 1234;
    float f = 123.456;
    char ch = 'a';
    printf("%8d,%2d\n",a,a);
    printf("%f,%8f,%8.1f,%.2f\n",f,f,f,f);
    printf("%3c\n",ch);
    return 0;
}

在这里插入图片描述

/*
 * @Description: 
 * @Author: 余红祥
 * @Date: 2022-06-30 21:20:40
 * @LastEditTime: 2022-06-30 21:28:53
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    static char a[]= "Hello, world!";
    printf("%s\n%15s\n%10.5s\n%2.5s\n%.3s\n",a,a,a,a,a);
    return 0;
}

在这里插入图片描述

1.3字符串输出函数 puts

格式:int puts
功能:向显示器输出字符串并且在输出结束后换行
说明:字符数组必须以'\0'结尾
返回值:成功返回非0数值  失败返回EOF

用代码演示:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char *s = "welcome";
    puts(s);
    return 0;
}

在这里插入图片描述

二、输入函数

2.1字符输入函数 getchar

通过man手册查询getchar的描述、参数及返回值。在终端下输入命令:man 3 getchar

格式:getchar()
功能:从键盘读一字符
返回值:正常,返回读取的值  失败,返回EOF

用例子演示字符输入函数,代码及演示结果如下:

/*
 * @Description: 
 * @Author: 余红祥
 * @Date: 2022-06-30 21:33:40
 * @LastEditTime: 2022-06-30 21:34:45
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int c = 0;    // initial
    printf("please enter a character:");
    c = getchar();
    printf("%c--%d->hex%#x\n",c,c,c);
    return 0;
}

在这里插入图片描述
注意:getchar返回值的含义是存储从键盘上读取的字符,返回值为int型而非char型,很多人不理解为什么是int型,实际上这里返回的是字符对应的ASCII码值,比如输入0,实际上返回0x30

2.2格式输入函数 scanf

由于getchar是读取单个字符,如果需要读取若干个字符,可以使用scanf函数。

格式:scanf("格式控制串",地址表)
功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回车键结束
返回值:成功返回输入的变量个数  失败返回EOF  
地址表:变量的地址,常用 &变量 比如&a

常用格式符如下:
在这里插入图片描述
常用修饰符如下:
在这里插入图片描述

用例子演示格式输入函数,代码及演示结果如下:

/*
 * @Description: 
 * @Author: 余红祥
 * @Date: 2022-06-30 21:51:27
 * @LastEditTime: 2022-06-30 21:56:31
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int yy = 0 , mm = 0 , dd = 0;
    int a = 0;
    float c = 0.0;
    printf("input year month day:");
    scanf("%4d%2d%2d", &yy, &mm, &dd);
    printf("%d-%d-%d\n", yy, mm, dd);
    printf("input int float:");
    scanf("%3d%*4d%f",&a,&c);
    printf("a=%d , c=%f\n",a,c);
    return 0;
}

在这里插入图片描述
注意:输入分隔符指定-一般以空格、TAB或回车键作为分隔符。
在输入数据时,遇到以下情况认为该数据结束:
1、空格、TAB或回车
2、宽度结束
3、非法输入

/*
 * @Description: 
 * @Author: 余红祥
 * @Date: 2022-06-30 22:04:02
 * @LastEditTime: 2022-06-30 22:07:43
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    char ch1 = 0 , ch2 = 0 , ch3 = 0;
    printf("input three characters:");
    scanf("%c%c%c", &ch1, &ch2, &ch3);
    printf("output three characters:");
    printf("ch1=%c , ch2=%c , ch3=%c\n", ch1, ch2, ch3);
    return 0;
}

在这里插入图片描述
注意:用“%c”格式符时,空格和转义字符作为有效字符输入

2.3垃圾字符处理

观察以下代码,以下代码存在垃圾字符问题:

/*
 * @Description: 
 * @Author: 余红祥
 * @Date: 2022-06-30 22:13:52
 * @LastEditTime: 2022-06-30 22:16:26
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a = 0;
    char ch = 0;
    printf("pelase input a number:");
    scanf("%d", &a);
    printf("a=%d\n", a);

    printf("please input a character:");
    scanf("%c", &ch);
    printf("ch=%c\n", ch);

    return 0;
}

在这里插入图片描述
上面运行结果可知,当用户输入的一个数字按下回车后,换行符’\n’还在缓冲区,接下来程序要输入一个字符变量时没有停顿让用户输入,而是直接把缓冲区的’\n’拿走了。这个换行符影响了我们的预期结果,因此称为垃圾字符。

以下是处理垃圾字符的两种方法:
1、调用getchar函数,把垃圾字符吃掉
2、用格式串中空格或者"%*c"来吃掉垃圾字符
常用第一种方法,代码如下:

/*
 * @Description: 
 * @Author: 余红祥
 * @Date: 2022-06-30 22:13:52
 * @LastEditTime: 2022-06-30 22:21:21
 * @LastEditors:  
 */
#include <stdio.h>

int main(int argc, char const *argv[])
{
    int a = 0;
    char ch = 0;
    printf("pelase input a number:");
    scanf("%d", &a);
    printf("a=%d\n", a);
    getchar();          //吃垃圾字符
    printf("please input a character:");
    scanf("%c", &ch);
    printf("ch=%c\n", ch);

    return 0;
}

在这里插入图片描述

2.4字符串输入函数 gets

格式:char *gets(char *s)
功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加'\0'
说明:输入串长度应小于字符数组维数
返回值:成功返回字符数组的起始地址  失败或输入结束返回NULL

以下代码演示:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char string[15];
    printf("please input a string:");
    gets(string);
    printf("%s\n", string);
    return 0;
}

在这里插入图片描述
从编译结果发现报警告,因为这个函数需要我们自己把控长度,编译器不会替我们检查长度。如果输入的字符串长度大于字符数组长度,会出现内存越界情况。

三、综合练习

1、用代码实现在终端上输入一行字符,原样输出
答:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char string[100] = {0};
    printf("please enter a string:\n");
    gets(string);
    puts(string);
    return 0;
}

2、从键盘输入a , b , c的值,求一元二次方程ax²+bx+c = 0的根,公式如下:
在这里插入图片描述
答:

#include <stdio.h>
#include <math.h>

int main(int argc, char const *argv[])
{
    float a = 0 , b = 0 , c = 0;
    float x1 = 0 , x2 = 0;
    float disc = 0 , p = 0 , q = 0;
    printf("please input a,b,c\n");
    scanf("%f%f%f", &a, &b, &c);
    getchar();
    disc = b*b - 4*a*c;
    if (disc < 0)
    {
        printf("error input!\n");       //避免出现小于0的异常情况
        return -1;
    }
    
    printf("disc = %f\n", disc);
    p = -b/(2*a);
    printf("p = %f\n", p);
    q = sqrt(disc)/(2*a);
    printf("q = %f\n", q);
    x1 = p + q;
    x2 = p - q;

    printf("\n\nx1 = %5.2f \nx2 = %5.2f \n",x1,x2); 

    return 0;
}

在这里插入图片描述
由于调用了动态库,编译时用了 -lm

ps:欢迎讨论问题,欢迎大佬指点,共同学习进步。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值