C语言scanf()与printf()函数的使用
一.scanf()函数的使用
头文件:#include<stdio.h>
功能:执行格式化的输出
函数原型:int scanf(char* format[, argument, …])
其调用格式为 : scanf("<格式化字符串>",<地址表>);
1.特点:
1.1.返回输入成功的数据个数,出错则为EOF(-1)
int a,b;
int n = scanf("%d %d", &a, &b);//正确输入(2,3)返回 2 ; 错误输入 a b 返回值 0 输入 1,a 返回 1;输入 a 1 返回0
//注:在vs下,当第一个元素读取失败时,第二个元素也会读取失败
1.2.scanf在获取字符串的时候遇到空格、制表符、换行符终止
比如:
char* s = malloc(20);
char* p = malloc(25);
scanf("%s", s);
scanf("%s", p);
printf("%s\n", s);
printf("%s\n", p);//s输入为hello world ,此时不会在提示输入,直接输出结果,此时s为hello,p为world。这是因为scanf在读取时遇到空格结束,此时剩下的world留在了缓冲区中,此时第二个scanf默认会获取到缓冲区留下的部分。而不会再提示用户输入。
1.3.scanf()函数不能避免输入越界的问题。
scanf()函数的妙用:
一般可以用它的返回值作为结束循环的标准。
while(scanf("%d",&a))//此时若想跳出循环,
//只需要输入一个不是数字的数据即可
{
语句1;
语句2;
}
2.解决scanf输入问题的三种方法
2.1、利用正则表达式来解决:
scanf("%[^\n]s",s);//含义:让scanf()读取除了\n之外的所有字符。
2.2、利用gets()函数实现:
函数原型:char* gets(char* s);
参数:用来存储字符串的空间
char *s=malloc(sizeof(char)*25);
get(s);
printf("%s\n",s);
free(s);
s=NULL;
2.3.利用fgets()函数实现
好处: 相对于scanf和gets函数来说,这个函数可以控制读取的个数,避免了缓冲区的溢出(这块也不知道讲的是否正确,懂得都懂)
函数原型:
头文件#include<stido.h>
char* fgets(char* s, int size, FILE * string);
参一:用来存储字符串的空间地址
参二:描述空间大小
参三: 读取字符串的位置。标准输入:stdin,来源
返回值:默认返回字符串
特点:预留‘\0’的存储空间;空间足够用,读取执行时的\n,否则舍弃‘\n’`
char *s=malloc(sizeof(char)*25);
fgets(s,25,stidin);//stdin为标准写入。默认只能读取25-1个字符,因为最后一个是留给'\0'的,就算输入再多也没用。
注:在有多个scanf()输入时,应加上getchar()来消除缓冲区的’\n’。
二、printf()函数
printf函数可以根据指定格式从标准输出设备中输出信息.
原型
int printf(const char* format, [argument] …);
(调用时需要添加<stdio.h>头文件
参数
format : 格式控制符, argument : 可选参数.
返回值
若成功则返回输出的字符数, 输出出错则返回负值.
额外说明
格式化字符串包括两部分内容 : 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%“开始, 后跟一个或几个规定字符, 用来确定输出内容格式.
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用”,"分开, 且顺序一一对应, 否则将会出现意想不到的错误.
注意:printf函数从左往右读取, 然后将先读取放到栈底, 最后读取的放在栈顶, 处理时候是从栈顶开始的.所我们看见的结果是, 从右边开始处理的.*/
printf("%d\n", n);//n=3 1 0 \n三个字符
int temp = 1234;
printf("%-6d\n", temp);//向左对齐,不够的用空格代替
printf("%6d\n", temp);//向右对齐,不够的用空格代替
printf("%2d\n", temp);//数值字符数超过2,此时按实际值输出
float a;
scanf("%f",&a);
printf("%.2f",a);//此时是小数点后保留2位小数,整数位不变
第一次写博客,有什么错误的地方或者没有补充到的地方希望大家指教,希望我们共同进步。