在学习c语言时,一般都会从printf 和 scanf 两个标准输入输出库(Standard I/O Library)中的函数入手,在这里想整理一下它们的用法
一、printf
我们常用的printf
函数是C语言中用于格式化输出到标准输出的函数。其功能包括格式化输出各种类型的数据(例如整数、浮点数、字符串等)以及控制输出的样式和排版
下面是一个最基本的printf代码,将由此为标本讲讲它的使用
#include <stdio.h>
int main()
{
float a=1.123;
printf("%5.1f/n",a);
return 0;
}
1.函数
printf
函数位于C语言和C++标准库中的输入输出库(I/O库)中,通常是在 <stdio.h>
头文件中声明的。只有声明了才能够使用printf函数。
2.占位符
(上面那个%f就是一个占位符)
占位符是在格式化输出中用来表示将在该位置插入实际数据的特殊标记或占位符符号。顾名思义就是先替数据占据一个位置。
下面介绍一些常见的占位符
%d: 输出整数
用法示例:printf("%d", 42);
%f: 输出浮点数
用法示例:printf("%f", 3.14);
%c: 输出字符
用法示例:printf("%c", ‘R’)
printf("%c",82 )//82是R的ASCII码值 也可以打印出R
%s: 输出字符串
用法示例:printf("%s", "Hello, World");
%x: 输出十六进制整数(小写字母表示)
用法示例:printf("%x", 255);
%X: 输出十六进制整数(大写字母表示)
用法示例:printf("%X", 255);
%o: 输出八进制整数
用法示例:printf("%o", 64);
%p: 输出指针地址
用法示例:printf("%p", &variable);
%u: 输出无符号整数
用法示例:printf("%u", 42);
%e: 以科学计数法输出浮点数(小写字母表示)
用法示例:printf("%e", 0.001);
%E: 以科学计数法输出浮点数(大写字母表示)
用法示例:printf("%E", 0.001);
%g: 自动选择 %f 或 %e 输出格式(当浮点数的绝对值小于 0.0001 或大于或等于 1e6(百万)时,
%g
使用%e
的格式来输出。)用法示例:printf("%g", 1234.56)
%G: 自动选择 %f 或 %e 输出格式(大写字母表示)
用法示例:printf("%G", 1000.0);
%lld: 输出长长整数
用法示例:printf("%lld", 123456789012345LL);
%llu: 输出无符号长长整数
用法示例:printf("%llu", 123456789012345ULL);
%zd:输出size_t类型
用法示例:printf("%zd",sizeof(char));
%%:输出%
#include <stdio.h>
int main()
{
char q[6] = "qwert"; // 加上空间存储 null 终止符
printf("%s", &q[0]); // 使用 %s 格式符打印字符串,从第一个字符开始打印;
printf("%s",q);//这样也是可以滴
return 0;
}
特别说明一下如何打印一个字符串
当你使用 %s
格式化字符串时,printf
函数期望接收一个指向字符串的地址作为参数,以便正确打印字符串。
字符串的地址是指向字符数组的第一个字符的地址,因为整个字符串是按顺序存储的。因此,在 printf
中,你需要使用 &
运算符来获取字符串的起始地址,以便 printf
函数能够遍历整个字符串并打印其中的字符,直到遇到 null 终止符 '\0'
为止。
int main()
{
char q[6] = "qwert"; // 包含 "qwert" 和一个空字符
q[3] = '\0'; // 在第4个位置添加一个空字符,表示字符串的结束
printf("%s", q); // 这将只打印 "qwe"
return 0;
}
3. 输出格式
printf函数可以指定输出函数的格式
如在文首提到的代码中
#include <stdio.h>
int main()
{
float a=1.123;
printf("%5.1f/n",a);
return 0;
}
%5.1中的“-5”代表输出最小宽度为5个字符,若不满5个则在前面加上空格补齐
.1代表保留一位小数
让我们一起看一下输出结果
我们可以看到前面补齐了两个空格
如果想让空格在后面,则可以在%后加上一个-,实现左对齐
#include <stdio.h>
int main()
{
printf("%-10.1f-------", 1.26);
return 0;
}
结果输出为
在输出字符串时,可用%.[x]输出指定长度,其中x代表要输出的长度。
#include <stdio.h>
int main()
{
char q[6] = "qwert";
printf("%.2s", q);//printf("%.2s", &q[0]);
return 0;
}
另外,说一下在输出一个数时,不会显示正负号,如果想输出正负号,可以在%后面加上一个正号
#include <stdio.h>
int main()
{
int a = 1, b = -2;
printf("%+d %+d", a, b);
return 0;
}
4.返回值
printf函数返回值为int类型 为所打印字符的个数
二、scanf
下面是一个最基本的scanf代码,将由此为标本讲讲它的使用
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
return 0;
}
1.基本介绍
scanf
是C语言标准库中用于从用户输入中读取数据的函数。它的工作方式类似于 printf
函数,但它用于输入(即读取)数据而不是输出(打印)数据。
2.流程
step1:scanf() 函数:用于读取用户的键盘输⼊
step2:计算机运行到这里会停下来,等待用户从键盘输⼊
step3: 用户输⼊数据、按下回车键后, scanf() 就会处理用户的输⼊,将其存⼊变量
3.输入格式
1.scanf 也是C语言标准库中用于从用户输入中读取数据的函数,因此也需要调用库函数
#include <stdio.h>
2.占位符 (原理与printf函数类似)
占位符允许指定要读取的数据类型,然后通过 &
运算符将数据存储到相应的变量中。请注意,正确匹配占位符和变量类型非常重要,否则可能会导致数据读取错误或内存损坏。
3.&运算符
&
运算符通常与 scanf
函数一起使用,以便将输入的值存储到变量中,如 scanf("%d", &a);
,其中 &a
用于传递变量 a 的地址,以便 scanf
将读取的数据存储到 a 中
char name[50];
printf("Enter your name: ");
scanf("%s", name); // 不需要使用 & 运算符
4.输入格式
占位符与取地址符一一对应,而键盘输入的数据便会储存进变量之中
scanf() 处理数值占位符时,会过滤空白字符,包括空格、制表符、换行符等。所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影响 scanf() 解读数据。另外,使用回车键,将输⼊分开,也不影响解读
以上这两种方式都是可以的
注意
%d的注意事项
%d 占位符会忽略开始的空格,数字处开始获取数据,后面如果有不属于整数的有效字符,就会停下来。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
printf("%d", a);
return 0;
}
如上代码读取完12即停止
%c注意事项
%c 不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表示跳过零个或多个空白字符。
%s注意事项
因为 %s 不会包含空⽩字符,所以⽆法⽤来读取多个单词,除非多个 %s ⼀起使⽤。
这也意味着, scanf() 不适合读取可能包含空格的字符串,比如书名或歌曲名。
用%s储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ %s 占位符时,应该指定读入字符串的最长长度,即写成 %[m]s
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char a[5];
scanf("%4s", a);
printf("%s", a);
return 0;
}
这将限制 scanf
读取的字符数量不超过 4 个字符,因为数组 a
的大小为 5 个字符,其中一个用于字符串结束符。这样,可以避免栈溢出错误。
有些时候面对不按格式的输入,我们还想让程序正常地跑起来,实现预期的功能,该怎么办呢
3.返回值
scanf返回值表示一个整数,表示成功读取变量的个数
例如
如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF
4.其他
include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return 0;
}
1
在上面那个代码中,输入生日时,如果用户输入2005-01-01 ,就会正确解读出年、月、日。问题是用户可能输⼊其他 格式,比如 2005/01/01 ,这种情况下, scanf() 解析数据就会失败
解决方案
scanf()
提供了一个赋值忽略符(assignment suppression character)*
。只要把*
加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
scanf("%d%*c%d%*c%d", &year, &month, &day);
这样无论输入什么符号都没有关系了
如何实现可以运行过程之中输入多组数据:运用while循环
while (scanf("%d%d", &a,&b)!=EOF)
{
;
;
}
总结
以上就是我分享的内容,介绍了printf scanf两个函数的使用
Thanks for reading