格式输出函数printf 与 格式输入函数scanf 【C语言从入门到精通系列(四)】


C语言未提供输入/输出关键字,其输入和输出是通过标准函数库printfscanf来实现的。


一、格式输出函数 print

1.1 printf 函数的基本语法

格式输出函数printf 可以输出各种类型的数据,包括整型、浮点型、字符型、字符串型等。 printf 函数将这些类型的数据格式化为字符串后,放人标准输出缓冲区,然后将结果显示到屏幕上。

printf函数的语法如下:

printf(const char *format, ...);

其中,"const char *format"即“格式控制”,是一个字符串,用来规定输出的字符串格式(format)。
省略号...是一个可变参数列表,这里也称输出表列。这里其表示一个或多个变量,即可以接受任意数量的参数。
字符串格式(format)相关代码含义如下表所示:

代码含义
%c字符
%d带符号整数(十进制整数)
%f浮点数
%s一串字符
%u无符号整数
%x无符号十六进制数,用小写字母
%X无符号十六进制数,用大写字母
%p一个指针
%%一个’%'符号

1.2printf函数 的 输出精度

1.2.1 浮点精度

用%f 精度修饰符可以指定想要的小数位数
如,%5.3f 会至少显示 5 位数字,如果打印的值少于 5 个字符,则会使用空格进行填充。
此外打印的浮点数会保留3位小数。
代码示例如下:

#include <stdio.h>

int main() {
    printf("%5.3f\n",1.2);
    printf("%5.3f\n",12345.2);
    printf("%5.3f\n",1.12345);
    printf("%5.3f\n",123456.123456);
    return 0;
}

输出结果如下:
               在这里插入图片描述


1.2.2字符串精度

对于字符串也可以控制“精度。”
如输出字符串"hello",按照"%10s"的格式输出。
"%10s"表示打印的最小字段宽度为 10 个字符。如果打印的字符串长度少于 10 个字符,则会使用空格进行填充。

#include <stdio.h>

int main() {
    printf("%10s\n","hello");
    printf("%10s\n","hello, world!");
    return 0;
}

                 在这里插入图片描述


printf 函数在控制固定精度且所有字符串的长度都不超过指定精度的情况下,所有输出都是右对齐的。即会在字符串左侧填充空格。
示例:

#include <stdio.h>

int main() {
    printf("%10s\n","1");
    printf("%10s\n","12");
    printf("%10s\n","123");
    printf("%10s\n","1234");
    printf("%10s\n","12345");
    printf("%10s\n","123456");
    return 0;
}

输出结果如下:
             在这里插入图片描述


除非在%符号后放置了负号。则可以消除字符串左侧的空格,实现左对齐。

#include <stdio.h>

int main() {
    printf("%-10s\n","1");
    printf("%-10s\n","12");
    printf("%-10s\n","123");
    printf("%-10s\n","1234");
    printf("%-10s\n","12345");
    printf("%-10s\n","123456");
    return 0;
}

输出结果如下:
           在这里插入图片描述


1.3 混合运算

使用C语言进行进行数据运算时,运算符左边的数字被称为左操作数,运算符右边的数字被称为右操作数

在不同的数据类型之间进行运算时,C语言会进行隐式类型转换,将不同类型的数据转换为相应的通用类型,然后再进行计算。在进行类型转换时,C语言规定会将较小的数据类型自动转换为较大的数据类型,以免发生精度丢失或数据溢出等问题。

当运算中包含浮点数时,运算结果将会是浮点型;
而当运算中只包含整数时,运算结果也会是整数。

此外,在除法运算中,当进行整数除法时,如果两个操作数都是整数,则运算结果也会是整数,并向下取整


计算过程中可以使用强制类型转换的方法来强制转换变量的类型(该转换不改变原变量的类型)。
具体的方法是:在要进行强制类型转换的变量前加括号,括号内备注类型。
具体示例如下边代码所示:

#include <stdio.h>

int main() {
    int a=5;
    int b=2;
    float c=5.0;
    float d=2.0;
    float e=a/b;
    float f=a/d;
    float g=c/b;
    float h=c/d;
    printf("%f\n",e);
    printf("%f\n",f);
    printf("%f\n",g);
    printf("%f\n",h);
    printf("==================================\n");
    //使用强制类型转换
    float i=(float)a/b;
    float j=a/(float)b;
    printf("%f\n",i);
    printf("%f\n",j);
    return 0;
}

输出结果如下:
         在这里插入图片描述


1.4 进制转换

通过printf函数可以将目标数值在相应进制下的数值输出。示例如下。

#include <stdio.h>

int main() {
    printf("%d\n", 123); // 默认10进制
    printf("%o\n", 123); // 8进制
    printf("%x\n", 123); // 16进制
    return 0;
}

输出结果如下:
               在这里插入图片描述


二、格式输入函数 scanf

2.1

C 语言通过格式输入函数scanf 来读取键盘输入。键盘输入又被称为标准输入。

在C语言中,&符号表示取地址运算符。它用于获取变量的内存地址

scanf函数的语法同:

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

第一个参数依然是格式控制。
省略号...是一个可变参数列表,这里也称输入表列。也是可以有不确定数量的参数。这里的每个参数,都是已经声明了的变量的地址。(只要被声明了类型即可,可以被赋值,也可以未被赋值)

下边给出一个简单的格式输入函数scanf的使用示例:

#include <stdio.h>

int main() {
    int i;
    scanf("%d", &i);
    printf("i=%d\n",i);
    return 0;
}

输出结果如下:
               在这里插入图片描述
其中第一个数字100是手动输入的,"i=100"是程序打印结果。


scanf标准输入的内容,需要被放到一个变量空间里。所以要赋值给的变量需要先声明一下,而且scanf的第二个参数需要转为地址。所以这里使用了取地址运算符&。


2.2 标准输入缓冲区

关于格式输入函数scanf,存在一个“标准输入缓冲区”来接收输入的内容。

当程序代码第一次出现scanf函数时,程序进程会被阻断,等待键盘输入相关内容,输入的内容首先被保存在缓冲区中,然后被赋值给目标变量。
当输入内容被赋值给某个变量后,缓冲区被清空,但是没有被完全清空,会留下一个换行符"\n"(也可以理解为一个空行)。这个时候如果程序代码再次出现scanf函数,则会根据scanf函数内的格式信息决定是否对该换行符"\n"进行忽略:

忽略:如果scanf函数读取的是整型数(%d)浮点数(%f) 或者 字符串,则会对缓冲区内留下的换行符"“\n”进行忽略。

不忽略:如果读取的是单个的字符(%c),则不会对换行符"\n"进行忽略。

当不能够忽略换行符时,即程序在scanf处不会再主动阻断来等待键盘输入。取而代之的是自动将缓冲区内的该换行符"\n"作为输入内容进行输入、赋值。这样通常会偏离我们的预期。

如果不加以干预,后边每当再一次遇到scanf函数读取字符,都会被自动输入一个换行符\n,而不会发生阻断。

为了解决这个问题,当换行符不能被忽略时,通常可以使用fflush函数在使用scanf函数读取字符前来清空缓冲区。

一个代码示例如下所示。其中依次输入一个整数,一个浮点数和一个字符,同时并打印出相关信息。在输入字符前使用了代码 fflush(stdin);。其中fflush的功能是清空,stdin表示缓冲区

#include <stdio.h>

int main() {
    int i;
    float f;
    char c;
    // 输入一个整数并打印
    printf("Please enter an integer:\n");
    scanf("%d", &i);
    printf("========Input is complete.========\n");
    printf("i = %d\n",i);
    // 输入一个浮点数并打印
    printf("Please enter a floating point number:\n");
    scanf("%f", &f);
    printf("========Input is complete.========\n");
    printf("f = %f\n",i);
    fflush(stdin);
    // 输入一个字符并打印
    printf("Please enter a character:\n");
    scanf("%c", &c);
    printf("========Input is complete.========\n");
    printf("the letter is %c\n",c);
    return 0;
}

代码的输入过程和输出结果如图所示:
            在这里插入图片描述


2.3 连续输入

scanf函数是有返回值的,而且在一个scanf函数中,是可以连续输入的。
在这种写法中,为了解决%c不忽略换行符的问题,通常只需要在格式化输入时的%c前加个空格即可。
代码示例如下:

#include <stdio.h>

int main() {
    int i,ret;
    float f;
    char c;
    ret=scanf("%d %c%f", &i,&c,&f);
    printf("i=%i,c=%c,f=%f",i,c,f);
    return 0;
}

输入过程和输出内容如下所示:
               在这里插入图片描述

2.4 补充

①scanf函数是没有精度控制的。具体如:scanf("%5.2f",&f)这样写是非法的。

②scanf函数连续输入时,scanf函数不仅可以使用空格作为分隔符,也可以使用逗号作为分割符。
具体示例如下:

#include <stdio.h>

int main() {
    int i,ret;
    float f;
    char c;
    ret=scanf("%d,%c,%f", &i,&c,&f);
    printf("i=%i,c=%c,f=%f",i,c,f);
    return 0;
}

输入过程及输出结果如下:
            在这里插入图片描述
需要说明的是,输入时使用的分割符必须与scanf函数中指定的分隔符是一致的,才能保证正确读取。逗号和空格不能够交叉使用。
scanf("%d %c %f", &i,&c,&f)对应的正确输入方式是123 a 12.34
scanf("%d,%c,%f", &i,&c,&f)对应的正确输入方式是123,a,12.34


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值