Linux--C语言之输入输出函数及格式控制输出

一、数据输入输出的概念及在C语言中的实现

数据的输入与输出是相对于计算机而言的。其中:

1.从计算机向外部设备输送数据称为输出。通常输出设备包括:显示器、打印机等;

2.从外部设备向计算机输送数据称为输入。通常输入设备包括:键盘、鼠标、扫描仪等。

在C语言中,输入输出是用标准库函数中的输入、输出函数实现的

二、 简单的格式输入与输出

(一)用简单的printf函数输出数据

1.一般格式

printf("格式控制",输出列表);

说明:

(1)格式控制:用一对双引号括起来,包括两种信息

​ 格式说明:由“%”和特定字符组成,如:%d、%c、%f等,是格式说明符,用于说明输出项目所采用的格式;

​ 普通字符:作为说明性的文字、符号等,照原样显示。

(2)输出列表:中的各项目指出了所要输出的内容,可以是常量、变量或表达式
(3)例如:
printf("a=%d,b=%f\n",a,b);

2.基本的格式字符

(1)%d:按十进制整数数据的实际长度输出

(2)%c:仅输出一个字符

(3)%s:输出的结果是字符串,例如:printf(“%s\n”,“CHINA”); 输出结果是字符串CHINA

(4)%f:一小数形式输出一个实数(含单双精度数),整数部分全部输出,并输出六位小数

(5)%e或%E:以指数形式输出一个实数(含单双精度数),小数点前仅一位非数字,并输出六位小数

(二)用简单的scanf函数输入数据

1.scanf函数的一般格式

scanf("格式控制",地址列表);

作用:将从键盘输入的值存入内存中所占的存储单元里,存储单元由地址标识

说明:

(1)格式控制:的含义同printf函数,说明输入的数据应使用的的格式

(2)地址列表:是由若干个地址组成的,可以是变量的地址或字符串的首地址。&是取地址运算符,用于取出变量的地址

(3)与格式输出一样,在格式控制中,用于说明输入数据格式的格式说明符是以%开头,后面紧跟的是具体的格式。

(4)输入的数据可用空格、Tab键、回车键之任一种分开

注意:

​ (1)scanf函数中的“格式控制”后面应当是变量的地址,由取地址运算符和变量名共同组成,不能仅是变量名:

scanf("%f%d", &a,&b);  

​ (2)如果“格式控制”中除了格式说明以外还有其它字符,则在输入数据时必须在对应位置输入与之相同的字符: 从键盘输入时必须输逗号: 3,4 ↲

 scanf("%d,%d", &a,&b); 

​ (3)用%c格式输入字符时,空格和转义字符都作为有效字符输入,应注意:只有输入:xyz ↲ 才能使a得到x,b得到y,c得到z

scanf("%c%c%c", &a,&b,&c);    

​ (4) 在输入数值型数据时,遇到空格、回车、Tab键或遇非法输入,则认为该数据结束:

scanf("%d%c%f", &a,&b,&c);         

​ (5)对于unsigned型变量所需的数据,可以用%u或%d格式输入。

(三) 较复杂的输入输出格式控制

说明:按指定格式输出数据的宽度、小数位数、上下行数据按小数点对齐、用八进制、十六进制输出等。

1.输出数据格式控制

(1)十进制形式

​ %d或%md:用于基本整型 int

​ %ld 或 %mld:用于长整型 long

​ %u 或 %mu:用于无符号基本整型 unsigned

​ %lu 或 %mlu:用于无符号长整型 unsigned long

(2)八进制形式

​ %o或%mo:用于基本整型 int

​ %lo 或 %mlo:用于长整型 long

(3)十六进制形式

​ %x 或 %mx :用于基本整型 int

​ %lx 或 %mlx:用于长整型 long

说明:

​ m表示输出的整型数据所占总宽度(即列数),其中:

​ 当实际数据的位数不到m位时,数据前面将用空格补满;

​ 若实际数据位数大于m,则以数据的实际位数为准进行输出。

​ 注意:一个int型整数也可以%u格式输出,反之一个unsigned型整数也可以%d、%o、%x格式输出。按相互赋值的规则处理。

2.字符型格式说明

(1)字符char型

​ %mc:输出的字符占m列,如:

printf(%3c”,’a’);  // 实际输出为:a 注::表示空格
(2)字符串

​ %ms 输出的字符串占m列。若串长>m,全部输出;若串长<m,左面补空格。

​ %-ms 输出的字符串长<m,右面补空格%-m.ns 只取字符串前n个字符。

​ 若n<m,右面补空格;若n>m,m自动取n值。

注意:

​ 一个整数,只要其值在0~255范围内,也可以用“%c”格式使其按字符形式输出。

​ 在输出前,系统会自动将该整数作为ASCII码转换成相应的字符;反之,一个字符也可以输出成一个整数。

案例:字符串输出
#include <stdio.h>

int main(void)
{
   printf("%3s,%7s,%-5.3s,%.4s\n","CHINA","CHINA","CHINA","CHINA"); //运行结果:CHINA, CH, CHI, CHIN  注:表示空格
    return 0;
}

3.实型格式说明符

(1)十进制数形式

​ %m.nf 或 %-m.nf

(2)指数形式

​ %m.ne 或 %-m.ne

(3)%g或%G形式

​ 根据数值的大小,自动选%f 或 %e中宽度较短的一种格式,不输出无意义的0。

​ 说明:

​ 在输出实型数据时,格式说明符中的m表示整个数据所占的宽度,n表示小数点后面所占的位数。

​ 如果在小数点后取n位后,所规定的数据宽度m不够输出数据前面的整数部分(包括小数点),则按实际的位数进行输出。

需要指出的是,在C语言中,用于输出单精度实型数据与双精度实型数据格式说明符是一样的。

4.顺序结构程序设计案例

程序中所有语句都是按自上而下的顺序执行的,不发生跳转

案例1:输入三角形的三边长,求三角形的面积。
/*
**需求:输入三角形的三边长,求三角形的面积。
  分析:① 设输入的三边能构成三角形;
 	   ② 求三角形面积的公式为S = sqrt(p(p−a)(p−b)(p−c)) 注:sqrt表示开根号
	   ③p = (a+b+c)/2.0
*/
#include <stdio.h>
#include <math.h>

int main()
{
    //声明变量存储三角形的三条边和面积
    float a,b,c; //三边
    float p; // 半周长
    float s; // 面积
    
    //给出输出提示,从键盘录入三角形的三条边
    printf("请输入三角形的三条边:");
    scanf("%f %f %f",&a, &b, &c);
    
    //判断输入的三条边能否构成三角形
    if(a + b > c && a + c > b && b + c > a)
    {
        //用海伦公式求解三角形的面积
        p = (a+b+c) / 2.0f;
        s = sqrt(p*(p-a)*(p-b)*(p-c));
        
        printf("三角形的面积为:%.2f\n",s);
    }
    else
    {
        printf("您输入的三条边不能构成三角形!\n")
    }
    return 0;
}


案例2:从键盘输入一个大写字母,要求用小写输出。
/*
**需求:从键盘输入一个大写字母,要求用小写输出。
  分析:大写字母与小写字母的ASCII码值相差32。
       对从键盘输入的大写字母加32即变为相应的小写字母。
*/
#include <stdio.h>

int main(void)
{
    //声明c1、c2两个变量分别存放字母的大小写
    char C1,C2; 
     
    //给出输入提示并从键盘录入一个大写字母
    printf("请输入一个大写英文字母:");
    scanf("%c",&c1);
    
    c2 = c1 + 32;
     
    printf("相应的小写字母为:%c\n",c2);
    
    return 0;
}
案例3:求解一元二次方程ax2+bx+c的根
/*
**需求:系数a、b、c从键盘输入;
  分析:①已知一元二次方程的根为:x1=(-b/2a+sqrt(b^2-4ac))/2a,x2=(-b/2a-sqrt(b^2-4ac))/2a;
       ② 可将上式分解为两项:m=-b/2a,n=sqrt(b^2-4ac)/2a;
       ③ 则:x1=m+n,x2=m-n;
*/
#include <stdio.h>
#include <math.h>

int main(void)
{
    //声明变量存储一元二次方程系数
    float a,b,c;
    //声明变量存储一元二次方程的根以及判别式的绝对值和处理量
    float x1,x2,d,m,n;
    
    //输出提示信息并从键盘录入一元二次方程的三个系数
    printf("请输入一元二次方程的三个系数:");
    scanf("%f %f %f",&a, &b, &c);
    
    //计算根的判别式d
    d = b*b - 4*a*c; //d表示根的判别式,说明:d>0时,方程有两个不等的实根;d=0时,方程有两个相等的实根;d<0时,方程无实根。
    // 根据判别式的值判断方程根的情况
    if (d < 0)
    {
        printf("方程没有实数根!\n");
    } 
    else
    {
        // 计算方程的根
        m = -b / (2 * a);
        // 使用 fabs函数确保 d 为非负数
        n = sqrt(fabs(d)) / (2 * a); 
        x1 = m + n;
        x2 = m - n;
        
        printf("x1=%.2f\nx2=%.2f\n",x1,x2);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值