💻作者简介:曾与你一样迷茫,现以经验助你入门 C 语言
💡个人主页:@笑口常开xpr的个人主页
📚系列专栏:C 启新程
✨代码趣语:程序是计算机的灵魂,没有程序,计算机只是一堆毫无生气的硬件。
💪代码千行,始于坚持,每日敲码,进阶编程之路。
在编程的世界里,每一行代码都可能隐藏着无限的可能性。你是否想过,一个小小的程序究竟能改变什么?它可以是解决复杂问题的工具,也可以是实现梦想的桥梁。今天,就让我们一起走进 C 语言的世界,探索它的无限潜力。
printf
- 定义
printf 是 C 语言中的一个标准库函数,名字里面的f代表format(格式化),表示可以定制输出文本的格式。
- 函数原型
int printf(const char *format,…);
- 作用
按照指定的格式字符串 format,将后面的参数进行格式化转换,并输出到标准输出设备(通常是控制台屏幕)。
- 基本用法
printf是在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源代码头部引入这个头文件。
- 下面使用代码展示
printf的使用
#include<stdio.h>
int main()
{
printf("hello world");
return 0;
}
输出结果
hello world
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 12128)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
- 默认printf不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。换行符属于转义字符,除了换行符还可以添加不同的转义字符。
下面展示
代码示例
。
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
输出结果
hello world
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 2292)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
- 除了在语句末尾,还可以在语句的任意地方添加转义字符。
下面是
代码示例
。
#include<stdio.h>
int main()
{
printf("hello\nworld\n");
return 0;
}
输出结果
hello
world
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 14708)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
- 占位符
(1)含义
printf可以在输出文本中指定占位符。所谓 “占位符”,就是这个位置可以用其他值代入。
(2)基本用法
下面示例中,There are %d students\n是输出文本,里面的%d就是占位符,表示这个位置要用其他值来替换。占位符的第一个字符一律为百分号% ,第二个字符表示占位符的类型, %d 表示这里代入的值必须是一个整数。printf()后面的参数就是替换占位符的值,上面的例子是整数3替换%d 。执行后的输出结果就是There are 3 students 。
下面是
代码示例
。
#include<stdio.h>
int main()
{
printf("There are %d students\n", 3);
return 0;
}
输出结果
There are 3 students
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 9224)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
当然和转义字符一样,可以同时使用多个占位符。printf()参数与占位符是一 一对应关系,如果有n个占位符,printf()的参数就应该有n个。如果参数个数少于对应的占位符,printf()可能会输出内存中的任意值。
下面是
代码示例
。
#include <stdio.h>
int main()
{
int num1 = 10, num2 = 20, num3 = 30;
// 使用多个%d占位符输出整数
printf("三个整数分别为:%d,%d,%d\n", num1, num2, num3);
return 0;
}
输出结果
三个整数分别为:10,20,30
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 10032)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
(3) 常见的占位符
%a :十六进制浮点数,字⺟输出为⼩写。
%A :十六进制浮点数,字⺟输出为⼤写。
%c :字符
%d :十进制整数。
%e :使用科学计数法的浮点数,指数部分的e为小写。
%E :使用科学计数法的浮点数,指数部分的E为大写。
%i :整数,基本等同于%d。
%f :小数(包含float类型和double类型)。//float %f double - %lf
%g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的e为⼩写。
%G :等同于%g,唯⼀的区别是指数部分的E为⼤写。
%hd :十进制short int 类型。
%ho :八进制short int 类型。
%hx :十六进制short int 类型。
%hu :unsigned short int 类型。
%ld :十进制long int类型。
%lo :八进制long int类型。
%lx :十六进制long int类型。
%lu :unsignedlong int类型。
%lld :十进制long long int类型。
%llo :八进制long long int类型。
%llx :十六进制long long int类型。
%llu :unsigned long long int类型。
%Le :科学计数法表示的long double类型浮点数。
%Lf :long double 类型浮点数。
%n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
%o :⼋进制整数。
%p :指针(用来打印地址)。
%s :字符串。
%u :⽆符号整数(unsigned int)。
%x :⼗六进制整数。
%zd : size_t 类型。
%% :输出⼀个百分号。
- 输出格式
(1)限定宽度
printf()允许限定占位符的最小宽度
下面示例中,%5d表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格;如果改成左对齐,在输出内容后面添加空格,可以在占位符的%的后面插入一个’-'号。
下面是
代码示例
。
#include <stdio.h>
int main()
{
printf("%5d\n", 123);
printf("%-5d\n",123);
return 0;
}
输出结果
123
123
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 25280)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
(2)总是显示正负号
默认情况下, printf() 不对正数显示+号,只对负数显示-号。如果想让正数也输出+号,可以在占位符的%后面加一个+ 。下面示例中, %+d可以确保输出的数值,总是带有正负号。
下面是代码示例
。
#include <stdio.h>
int main()
{
printf("%+d\n", 123);
printf("%-d\n", -123);
return 0;
}
输出结果
+123
-123
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 10020)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
(3)限定小数位数
输出小数时,有时希望限定小数的位数。
下面示例中,默认小数点后面保留6位,如果希望小数点后面只保留两位,占位符可以写成%.2f。
%6.2f表示输出字符串最小宽度为6,小数位数为2。所以,输出字符串的头部有两个空格。
下面是
代码示例
。
#include <stdio.h>
int main()
{
printf("%.2f\n", 0.5);
printf("%6.2f\n", 0.5);
return 0;
}
输出结果
0.50
0.50
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 20608)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
(4)最小宽度和小数位数这两个限定值,都可以用*代替,通过printf()的参数传入。
下面是
代码示例
。
#include <stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}
输出结果
0.50
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 24536)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
- 返回值
printf 函数返回输出的字符数。
如果发生错误,返回一个负数。
例如,int count = printf(“Hello”);count 的值将为5,因为 Hello包含 5 个字符。
scanf
- 含义
C 语言中用于从标准输入设备(通常是键盘)读取数据的函数
- 函数原型
int scanf(const char *format,…);
- 功能
程序运行到这个语句时,会停下来,等待用户从键盘输入。
用户输入数据、按下回车键后, scanf() 就会处理用户的输入,将其存入变量。
- 基本用法
(1)>scanf是在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源代码头部引入这个头文件。
它的第一个参数是一个格式字符串,里面会放置占位符,告诉编译器如何解读用户的输入,需要提取的数据是什么类型。它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。
scanf()的第一个参数%d,表示用户输入的应该是一个整数。%d就是一个占位符,%是占位符的标志,d表示整数。
第二个参数&score表示,将用户从键盘输入的整数存入变量score中。
注:变量前面必须加上&运算符(指针变量除外),因为scanf() 传递的不是值,而是地址,即将变量score的地址指向用户输入的值。如果这里的变量是指针变量(比如字符串变量),那就不用加&运算符。
- 下面使用代码展示
scanf的使用
#include<stdio.h>
int main()
{
int score = 0;
printf("请输入成绩:");
scanf("%d", &score);
printf("成绩是:%d\n", score);
return 0;
}
输出结果
请输入成绩:30
成绩是:30
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 16396)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
画图演示
注:标准输入一般指的就是键盘,标准输出一般指的就是屏幕
(2)输入多个变量
下面展示一些 将键盘输入读入多个变量
。
scanf(“%d %d %f %f”, &i, &j, &x, &y);
上面示例中,格式字符串%d%d%f%f ,表示用户输入的前两个是整数,后两个是浮点数。这四个值依次放入 i 、j 、x 、y 四个变量。scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。
(3)scanf 的返回值
scanf()的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回0 。
如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF (-1)。
EOF - end of file 文件结束标志
- 下面使用代码展示
EOF的使用
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int r = scanf("%d%d%d", &a, &b, &c);
printf("a = %d b = %d c =%d\n", a, b, c);
printf("r = %d\n", r);//按三次ctrl+z,输出r为-1,即EOF,scanf会读取失败
return 0;
}
输出结果
1 2 3
a = 1 b = 2 c =3
r = 3
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 25460)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
如果输入两个数,在VS编译器里可以连续按三次ctrl+z结束输入。
- 输出结果展示
^Z
^Z
^Z
a = 0 b = 0 c =0
r = -1
D:\VS代码\gitee\c-language-learning\test_11_23\Debug\test_11_23.exe (进程 9568)已退出,代码为 0 (0x0)。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
(4)占位符
scanf的占位符和printf的占位符基本一致。
除了%c以外,都会自动忽略起首的空白字符。
%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成scanf(" %c", &ch) ,即%c前加上一个空格,表示跳过零个或多个空白字符。
占位符%s ,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
scanf() 不适合读取可能包含空格的字符串
scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。为了防止这种情况,使用%s占位符时,应该指定读入字符串的最长度,即写成%[m]s ,其中的[m]是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。
scanf() 提供了一个赋值忽略符 * 。只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
总结
至此,关于 C 语言的输入scanf和输出函数printf探索暂告一段落,但你的编程征程才刚刚启航。写代码是与机器深度对话,过程中虽会在语法、算法困境里挣扎,但这些磨砺加深了对代码的理解。愿你合上电脑后,灵感不断,在 C 语言的世界里持续深耕,书写属于自己的编程传奇,下一次开启,定有全新的精彩等待。小编期待重逢,盼下次阅读见你们更大进步,共赴代码之约!