【C语言】库函数scanf和printf详解,地表最全总结,不看后悔系列 您所在的位置:网站首页 scanf中float对应什么 【C语言】库函数scanf和printf详解,地表最全总结,不看后悔系列

【C语言】库函数scanf和printf详解,地表最全总结,不看后悔系列

2024-07-11 07:39| 来源: 网络整理| 查看: 265

前言:千里之行始于足下。库函数家族数量庞大,scanf和printf作为C语言中的基础输入输出函数,既是我们学习库函数的开端,也是逐步掌握更复杂的编译技巧的必要步骤。下面由我带来一些知识点汇总,希望对大家有所帮助。

目录

一、printf知识汇总

       1、基本用法

       2、printf的占位符

       3、输出格式

  ①限定宽度

  ②总是显示正负号

  ③限定小数位数

  ④输出部分字符串

二、scanf知识汇总

      1、基本用法

      2、scanf的返回值

      3、scanf的占位符

      4、赋值忽略符

一、printf知识汇总 1、基本用法:

printf函数主要用于输出,它可以将格式化的数据输出到屏幕上,让我们能够清晰地看到程序运行的结果。无论是输出整数、浮点数、字符还是字符串,printf都能轻松应对,让我们能够方便地调试程序,查看变量的值,以及展示程序的运行结果。

printf()的作用是将参数文本输出到屏幕,他名字里面的print是打印;f代表format(格式化),表示可以定制输出文本的格式。

#include int main() { printf(“hello world”); return 0; }

上面命令会在屏幕上输出一条文字“hello world”。

注意:

①printf("hello world\n") ②printf("hello\nworld") ①结果:hello world |(这个是光标) ②结果:hello world|(这个也是光标) printf()不会在尾行自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。为了让光标移动到下一行的开头(上图①处),可以在输出文本的结尾添加一个换行符\n,如果文本内部有换行,也是可以通过插入换行符来实现(上图②处)。printf()是在标准库的头文件stdio.h定义的,使用这个函数之前,必须在源码文件头部引入这个头文件(#include )。

 

2、printf的占位符:

(1)、printf()可以在输出文本中指定占位符。

所谓“占位符”,就是这个位置可以用其他值代入。

#include int main() { printf("合计%d个人\n",10); return 0; }

上面实例中合计%d个人\n是输出文本,这里的%d就是占位符,这个表示这个位置要用其他值来代替换。占位符的第1个字符一律用百分号%,第2个字符表示占位符的类型,%d表示这里代入的值必须是一个整数。

printf()的第2个参数就是替换占位符的值,上面的例子是整数10替换%d。执行后的输出结果就是:合计10个人。

常用的占位符除了%d,还有%s表示代入的是字符串。:

#include int main() { printf("%s will be better","tomorrow"); return 0; }

上面例子中,%s表示代入的是一个字符串,所以printf()的第2个参数就必须是字符串,这个字符串是tomorrow。执行后输出的就是:tomorrow will be better。

输出文本里面可以使用多个占位符。

#include int main { printf("%s says it is %d o'clock","job",12); return 0; }

上面例子中,输入文本%s says it is %d o'clock有两个占位符,第1个站是字符串占位符%s,第2个是整数占位符%d,分别对应printf()的第2个参数(job)和第3个参数(12)。执行后输出的就是:job says it is 12 o'clock。

综上所述,printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个,如果参数个数少于对应的占位符,printf()可能输出内存中的任意值。

(2)、占位符汇总:

Tips:按照字母顺序排序,相同颜色荧光笔标记为相似的一组。

%a:十六进制浮点数,字母输出为小写

%A: 十六进制浮点数,字母输出为大写。

%c : 字符。 %d:十进制整数。%e: 使用科学计数法的浮点数,指数部分的e为小写。

%E : 使用科学计数法的浮点数,指数部分的E为大写。

%i:整数,基本等同于%d。 %f : 小数 (包含float类型和 double类型)。%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类型。

%x: 十六进制long int类型。

%lu: unsigned long 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:无符号整数(unsignedint)。

%x :十六进制整数。

%zd: size_t类型。

%%:输出一个百分号。

3、输出格式:

printf()可以定制占位符的输出格式,大体分为以下四种。

①限定宽度:

printf()允许限定占位符的最小宽度。

#include int main() { printf("%5d\n",123); return 0; } //结果为“ 123”(前面空两格)

 上面示例中,%5d表示这个占位符的宽度至少是5位。如果不满5位,对应的值在前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格,如果希望改为左对齐,在输出内容后面添加空格。可以在占位符的百分号的后面插入一个-号。

即把上例中的%5d改为%-5d,输出结果变为“123  ”(为左对齐)

对于小数,这个限定符会限制所有数字的最小显示宽度。

#include int main() { printf("%12f\n", 123.45); return 0; } //结果输出为“ 123.450000”

上面示例中,%12f表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位,所以123.45输出结果的头部会添加2个空格(小数点也占位哦)。

②总是显示正负号:

默认情况下,printf()不对正数显示+号,只对负数显示号。如果想让正数也输出+号,可以在占位符的%后面加一个+。

#include int main() { printf("%+d\n",12);//输出 +12 printf("%+d\n",-12);//输出 -12 return 0; }

上面示例中,%+d 可以确保输出的数值,总是带有正负号。

③限定小数位数:

输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面只保留两位,占位符可以写成%.2f。

#include int main() { printf("Number is %.2f\n",0.5); return 0; } //结果输出为:Number is 0.50

上面示例中,如果希望小数点后面输出3位(0.500),占位符就要写成%.3f。

这种写法可以与限定宽度占位符,结合使用。

#include int main() { printf("%6.2f\n", 0.5); return 0; } //输出结果为:“ 0.50”

上面示例中,%6.2f表示输出字符串最小宽度为6,小数位数为2。所以,输出字符串的头部有两个空格。

最小宽度和小数位数这两个限定值,都可以用*代替,通过printf()的参数传入。

#include int main() { printf("%*.*f\n",6,2,0.5);//等同于printf("%6.2f\n",0.5); return 0; }

上面示例中,%*.*f 的两个星号通过printf()的两个参数6和2传入。

④输出部分字符串:

%s 占位符用来输出字符串,默认是全部输出。如果只想输出开头的部分,可以用%.[m]s指定输出的长度,其中[m]代表一个数字,表示所要输出的长度。

#include int main() { printf("%.5s\n", "hello world"); return 0; } //结果输出:hello

上面示例中,占位符%.5s表示只输出字符串“hello world”的前5个字符,即“hello”。

二、scanf知识汇总 1、基本用法:

scanf函数主要用于输入,它可以从键盘上读取用户输入的数据,并将其存储到程序中定义的变量中。这样,我们就可以通过scanf函数获取用户的输入,然后根据用户的输入来执行相应的操作。比如,我们可以让用户输入两个数,然后计算它们的和并输出

即scanf()函数用于读取用户的键盘输入。当程序运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据、按下回车键后,scanf()就会处理用户的输入,将其存入变量。

它的原型定义在头文件stdio.h。

scanf() 的语法跟 printf()类似。

 下面是scanf函数的参数:

scanf("%d",&i);

它的第一个参数是一个格式字符串,里面会放置占位符(与printf()的占位符基本一致),告诉编译器如何解读用户的输入,需要提取的数据是什么类型。 这是因为C语言的数据都是有类型的,scanf()必须提前知道用户输入的数据类型,才能处理数据。它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。

上面示例中,scanf()的第一个参数 %d,表示用户输入的应该是一个整数。%d就是一个占位符,%是占位符的标志,d表示整数。第二个参数&i表示,将用户从键盘输入的整数存入变量i。

注意: 变量前面必须加上&运算符(指针变量除外),因为scanf()传递的不是值,而是地址,即将变量的地址指向用户输入的值。如果这里的变量是指针变量(比如字符串变量),那就不用加&运算符。

 

下面是一次将键盘输入读入多个变量的例子。

scanf("%d%d%f%f",&i,&j,&x,&y);

上面示例中,格式字符串%d%d%f%f,表示用户输入的前两个是整数,后两个是浮点数,比如1 -20 3.4 -4.0e3。这四个值依次放入i、j、x、y四个变量。 scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。 所以,用户输入的数据之间,有一个或多个空格不影响scanf()解读数据。另外,用户使用回车键,将输入分成几行,也不影响解读。  

scanf()处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。

#include int main() { int x; float y; //用户输入“-13.45e12# 0" scanf("%d",&x); printf("%d\n",x); scanf("%f",&y); printf("%f\n",y); return 0; }

上面示例中,scanf()读取用户输入时,%d占位符会忽略起首的空格,从-处开始获取数据,读取到 -13 停下来,因为后面的,不属于整数的有效字符。这就是说,占位符%d 会读到-13。第二次调用scanf( )时,就会从上一次停止解读的地方,继续往下读取。这一次读取的首字符是.,由于对应的占位符是%f ,会读取到.45e12,这是采用科学计数法的浮点数格式。后面的# 不属于浮点数的有效字符,所以会停在这里。 由于scanf()可以连续处理多个占位符,所以上面的例子也可以写成下面这样。

#include int main() { int x; float y; //用户输入“-13.45e12# 0" scanf("%d%f",&x,&y); return 0; } 2、scanf的返回值:

scanf 函数的返回值是一个整数,它表示成功匹配和赋值的输入项数。具体来说,scanf 会根据提供的格式字符串读取输入,并尝试将输入的值赋给相应的变量。对于每一个成功匹配和赋值的输入项,scanf 的返回值都会增加。

这里有几个关于 scanf 返回值的重要点:

成功匹配的输入项数:如果格式字符串中有三个 % 格式说明符,并且 scanf 成功地从输入中读取并匹配了三个值,那么它将返回 3。遇到不匹配或非法输入:如果输入与格式字符串不匹配,或者输入了非法字符(比如对于 %d 期望一个整数,但输入了一个字符),scanf 可能会停止读取并返回已经成功匹配的输入项数。例如,如果格式字符串是 "%d %d" 但输入是 "123abc",scanf 只会读取 123 并返回 1。到达文件结束或输入结束:如果 scanf 在读取任何输入之前就遇到了文件结束(EOF)或输入结束(比如在命令行中输入了 Ctrl+D(在 Unix/Linux/macOS 上)或 Ctrl+Z(在 Windows 上)),它将返回 EOF(通常是 -1)。没有匹配任何输入项:如果 scanf 的格式字符串与输入完全不匹配,它将返回 0。

3、scanf的占位符:

scanf()常用的占位符如下,与printf()的占位符基本一致。

%c:字符。

%d : 整数。%f: float类型浮点数。

%lf: double 类型浮点数。%Lf: long double类型浮点数。

%s: 字符串。%[]:在方括号中指定一组匹配的字符(比如%[0-9]),遇到不在集合之中的字符,匹配将会停止。

上面所有占位符之中,除了%c 以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。如果要强制跳过字符前的空白字符,可以写成scanf("  %c", &ch),即%c前加上一个空格,表示跳过零个或多个空白字符。

下面要特别说一下占位符%s,它其实不能简单地等同于字符串。它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。 因为%s 不会包含空白字符,所以无法用来读取多个单词,除非多个%s一起使用。这也意味着, scanf() 不适合读取可能包含空格的字符串,比如书名或歌曲名。另外,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。

为了防止这种情况,使用%s 占位符时,应该指定读入字符串的最长长度,即写成%[m]s,其中的[m]是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃。

4、赋值忽略符: #include 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; }

上面示例中,如果用户输入2020-01-01,就会正确解读出年、月、日。问题是用户可能输入其他格式,比如2020/01/01,这种情况下,scanf()解析数据就会失败。

为了避免这种情况,scanf()提供了一个赋值忽略符(assignment suppression character)*。只要把*加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。

#include int main() { int year = 0; int month =0; int day = 0; scanf("%d%*c%d%*c%d",&year,&month,&day); return 0; }

上面示例中,%*c就是在占位符的百分号后面,加入了赋值忽略符*,表示这个占位符没有对应的变量,解读后不必返回。

结语:printf和scanf可以说贯穿了编程的始终,它们是程序员手中不可或缺的工具。它们以简洁而强大的功能,为程序员提供了一个与计算机和用户交互的桥梁,让程序不再是孤立的存在,而是能够与用户进行对话、交流的智能体。让我们在编程的道路上,善用printf和scanf,创造出更多优秀、有用的程序,为我们的生活带来更多的便利和乐趣。

如果上述内容对您有帮助的话,还请点赞收藏✿

如果发现内容有误,还请给予指正,十分感谢;)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有