韩国源代码交易网站陕西网站建设网络公司
提示:在c语言中两个函数学习是必不可少的,输入和输出函数,接下来小编带大家去学习一下printf输出函数和scanf输入函数吧。
文章目录
- 一、printf学习
- 1、printf的作用
- 2、printf ()输出格式
- 2.1、限定宽度
- 2.2、显示正负号
- 3.3、限定小数位数
- 4.4、输出字符串
- 3、深入了解printf打印指针
- 二、占位符学习
- 三、scanf学习
- 1、scanf的基本用法
- 2、单组输入代码学习:输入学生成绩
- 3、多组输入代码学习
- 4、scanf处理用户输入的原理
- 5、scanf的返回值
- 6、特殊情况的占位符%c在scanf中的使用
- 7、重点作为打印字符串的占位符%s
- 四、总结
一、printf学习
在这里简单介绍一下printf函数:printf是一个库函数,它的功能是在标准输出设备(一般指屏幕上)进行信息的打印。
1、printf的作用
- printf()的作用是将参数文本输出到屏幕,print是打印的意思,f代表format(格式),表示可以定制输出文本的格式(通俗点也就是按照指定的格式进行打印数据)。
- printf()在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源代码头部引入这个头文件。
#include<stdio.h>
int main()
{printf("hello world\n"); return 0;
}
注意:
printf()不会在行尾自动换行,运行结束后,光标就停留在输出结束的地方,不会自动换行。如果想换行,可以在文本后面加一个换行符\n
如果文本内部也有换行,也可以通过插入换行符来实现,如下方的代码:
#include<stdio.h>
int main()
{printf("hello\nworld\n");return 0;
}
2、printf ()输出格式
提示:学习这个内容,参考后面讲述内容占位符加以理解
printf()可以定制占位符的输出格式
2.1、限定宽度
printf()允许限定占位符的最小宽度
int main()
{printf("%5d\n",123);return 0;
}
分析 |
上面的案例中,%5d表示这个占位符的宽度至少为5位。如果不满足5位,少了几位就在要输出的数前面用空格补齐。%5d表示输出的值默认为右对齐,即输出内容前面会有空格;如果希望改成左对齐,即在输出内容后面添加空格,可以在写成%-5d,在%后面加负号即可。但是我们如果打印七位的话就会直接打印七位,而不是五位,所以我们这里说的是限定他的最小宽度。
int main()
{printf("%12f",123.45);return 0;
}
分析:对于小数,这个限定符会限制所有数字的最小显示宽度 |
当用%f打印小数小数点后面默认打印六位,上面123.45小数点后面是45,不够六位补上四个0;在这里我们用%12f来打印,需要它小数整数部分包括后面的0输出一共要打12位,如果不满足12位,则在前面用空格补上。
2.2、显示正负号
默认情况下,printf ()不对整数显示+号,只对负数显示-号,这里只要在%后面加一个正号就可以显示正号了。
int main()
{printf("%+d", 123);return 0;
}
3.3、限定小数位数
输出小数时,有时希望限定小数的位数,举例来说,希望小数点后面只保留两位,占位符可以写%.2f,但是会四舍五入的。
int main()
{printf("%.2f", 123.45562);return 0;
}
分析: |
4.4、输出字符串
%s输出字符串默认是全部输出,如果只想输入开头的部分,可以用%.[m]s指定输出的长度,其中[m]代表一个数字,表示所要输出的长度。
int main()
{printf("%.5s\n", "hello world");return 0;
}
分析:
在这里前面输出文本占位符为%.5s,表示输出五个字符,所以只打印hello。
3、深入了解printf打印指针
今天写题目碰到一个有意思的题目,让我对printf有了不同的见解,一直以来我对于printf的想法就是利用占位符输出指定格式的数据到标准输出中,但是今天我看到了一串代码。
在这里小编就来简单分析一下,我们就是将str指针直接给printf进行打印,而不是采用%的形式的占位符进行格式化打印,于是我找到了printf的函数,对printf有了一个进一步的了解,在这里也将它讲述给我的读者们。
printf函数原型
printf的参数原来就是一个指针,这个函数的作用就是将函数参数的指针指向的那个字符串写入标准输出中,也就是在我们的屏幕打印,后面部分则是我们所日常了解的:如果传递进来的参数是格式说明符也就是我们所说的占位符,那么后面的参数可以被格式化替换占位符并且将它打印。所以在这里扩展的就是日后我们在printf中直接看到指针的时候不要认为它的语法是错误的,在这里它属于正确语法,printf就是将指针所指向的字符串进行打印。
二、占位符学习
所谓占位符,就是这个位置的值会被后面的值植入(替换)
案例一: 占位符:%d
int main()
{printf("%d个和尚有水喝,%d个和尚没水喝\n",1,3);return 0;
}
上面的案例中,双引号引起来的是输出文本,里面的%d就是占位符,表示这个位置要用其他值来替换。占位符的第一个字符一律为%,第二个字符表示占位符的类型,%d表示这里代入的值必须是一个整数。所以printf的后面两个参数1,3就是替换占位符的值。
案例二:占位符:%s
int main()
{printf("%s的成绩是100\n", "张三");return 0;
}
在上面的案例中,%s表示代入的是一个字符串,所以printf()的第二个参数就必须是字符串,张三就是字符串替代前面的输出文本中的%s。执行后输出为“张三的成绩是100”。
案例三: 多个占位符
int main()
{printf("%s的成绩是%d\n", "张三",100);return 0;
}
在上面的案例中,输出文本中的占位符%s对应第二个参数张三,占位符%d对应第三个参数100,它们之间是一一对应关系,如果有n个占位符,printf()的参数就因该有n+1个。如果参数个数少于对应的占位符,printf()可能会输出内存中的任意值。
三、scanf学习
1、scanf的基本用法
- scanf ()用于读取用于的键盘输入,当程序运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据,按下回车键后,scanf就会处理用户的输入,将其存入变量里面。
- scanf在使用时需要包含头文件,它的头文件是stdio.h
- scanf和printf的语法类似
- scanf第一个参数是一个格式字符串,里面放着占位符,告诉编译器如何解读用户的输入,需要提取的数据是什么类型。它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。
2、单组输入代码学习:输入学生成绩
int main()
{int score = 0;printf("请输入学生成绩:");//输入scanf("%d",&score);//输出printf("学生成绩为:%d",score);return 0;
}
分析: |
3、多组输入代码学习
int main()
{int x, y, j, k = 0;scanf("%d%d%d%d",&x,&y,&j,&k);printf("%d %d %d %d", x, y, j, k);return 0;
}
分析: |
在上面代码中给大家演示了不同的占位符模板输入的情况,最上方的代码占位符之间没有任何间隔,第三张图占位符之间加了空格,第四张图加了换行符,但是我们在键盘上输入的时候,scanf处理占位符时,会自动过滤空白字符,包括空格,制表符,换行符等,也就是scanf遇到空格就不读取了
。而我们在输入的时候上方小编也演示了不同的输入方式,我们输入的数据之间,有一个或者多个空格不影响scanf解读数据,scanf在解读数据将空格跳过,另外在我们使用回车键的时候,将输入分成几行,也不影响解读
4、scanf处理用户输入的原理
scanf()处理用户输入的原理是,用户的输入先放入缓存,等按下回车键后,按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。
int main()
{//假设我们这里输入的值是 123.456#125 int x = 0; float y = 0; scanf("%d",&x);printf("%d\n",x);scanf("%f", &y);printf("%f", y);return 0;
}
分析: |
5、scanf的返回值
scanf()的返回值是一个整数,表示读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回零。如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。
在这里用代码来演示一下:
int main()
{int a = 0;int b = 0;int c = 0;int d = scanf("%d%d%d", &a, &b, &c);printf("a=%d\nb=%d\nc=%d\n",a,b,c);printf("%d",d);return 0;
}
没有任何数据读取如下图:返回值为0
读取错误或者遇到文件结束末尾:返回值为-1
6、特殊情况的占位符%c在scanf中的使用
1,上面的占位符之中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。下面代码演示:
整型变量输入输出:
字符型变量输入输出
分析: |
在这里其他类型变量输入的时候可以直接跳过空白字符来到它要的相应类型的位置,而字符型变量输入的时候不会忽略空白字符,因为空白字符也是字符因此在输入的时候他不会忽略空白字符,而是把它也计算在内,就如上图,我们是想要打印字符a,但是前面有空白字符所以我们打印的也是空白字符。
2,如果想要强制跳过字符前的空白字符,可以写成scanf(" %c",&ch),即% c前加一个空格,表是跳过零个或多个空白字符。
7、重点作为打印字符串的占位符%s
下面要特别说一下占位符%s,它不能等同于字符串,它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格,换行符,制表符等)为止。因为%s不会包含空白字符,所以无法用来读取多个单词,除非多个%s一起使用,这也意味着,scanf()不适合读取包含空格的字符,另外scanf()遇到%s占位符,会在字符串变量末尾存储一个空白字符’\0’。
分析: |
在这里printf识别占位符只有遇到’\0’才停止,所以把后面的内存空间所占的字符也打印出来了
分析: |
在这里系统报错是因为原先数组内存的是abcde这五个字符,然而用%s输入的时候却会在字符串变量末尾加上一个空字符’\0’,表示字符串的结尾。导致数组超出了的范围,数组越界而出现错误。
所以scanf()在将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以在存储字符串的时候,很可能会超出数组的边界,导致预先不到的结果。为了防止这种情况出现,使用占位符%s时,因该指定字符串的最大长度,即写成%[m]s,其中[m]表示一个整数,表示读取字符串的最大长度,后面的字符也将被丢弃。
分析: |
上面示例中,我们之后scanf输入字符串会在后面加上一个\0,arr是一个长度为5的字符串,scanf占位符%4s表示最多读取用户输入的4个字符,后面的字符将被丢弃,这样就不会出现上面那样的报错了,不存在数组溢出的风险。
四、总结
在这里就已经将所有有关于printf和scanf的知识学完啦,如果对你有所帮助请记得给小编点个赞鼓励一下