目录
1scanf和printf
1.1printf
printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以 定制输出⽂本的格式。
#include <stdio.h>
int main()
{
printf("hello world ");
return 0;
}
这应该是每个初学者敲得第一个代码吧。反正我是写的第一个代码。
1.2占位符
是指printf() 可以在输出⽂本中指定占位符
int main()
{
int a = 100;
printf("%d\n ", a);//%d就是printf中的占位符 输出整数
return 0;
}
打印字符串
int main()
{
printf("%s 是帅哥\n", "张三");//注打印字符串 字符串内容要加双引号
return 0;
}
多个占位符的时候
int main()
{
printf("%s 今天打cs 2了吗?打了%d个小时", " 陈韵", 6);//多个占位符
return 0;
}
printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个
1.3限制宽度
printf() 允许限定占位符的最⼩宽度。如果不满5位,对应的值的前⾯会添加空格。 输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空 格,可以在占位符的 % 的后⾯插⼊⼀个 - 号
#include <stdio.h>
int main()
{
printf("%5d \n", 123);//不满足五位数的在前面加空格
printf("%5d \n", 123456);//满足五位数并且超出的按原数输出
printf("% -drr", 1234 ); //
return 0;
}
1.4总是显⽰正负号
printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可 以在占位符的 % 后⾯加⼀个 + 。
#include <stdio.h>
int main()
{
int a = -10;
printf("% -d \n", -12);
printf("% +d \n", 12);
printf("% -d \n", a);
printf("% -d \n", a);
return 0;
}
1.5限定⼩数位数
int main()
{
printf("% *.*lf\n ", 12, 5, 123.436);
return 0;
}
1.6输出部分字符串
%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.[m]s 指定输出 的⻓度,其中 [m] 代表⼀个数字,表⽰所要输出的⻓度。
$include <stdio.h>
int main()
{
printf("%.5s\n", "asdfgertr");.//打印前五个字符
return 0;
}
2scanf
2.1sacnf
#include <stdio.h>
int main()
{
int input = 0;
printf("请输入成绩:");
scanf("%d", &input);//& 是取地址
printf("成绩是:%d ", input);
return 0;
}
scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
2.2scanf 可以输入多个数值
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);//scanf可以输入多个数值
printf("%d %d\n",a, b);
return 0;
}
2.3scanf 返回值
scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回 0 。
如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF (-1)。 EOF - end of file ⽂件结束标志
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int ret =scanf("%d %d %d %d", &a, &b, &c, &d);//这里的ret计算的是scanf的返回值数值读取几个返回值就是几。
printf("a= %d b=%d c= %d d=%d \n", a, b, c, d);
printf("ret = %d\n ", ret);
return 0;
}
运行结果
如果输⼊2个数后,按 ctrl+z ,提前结束输⼊( 在vs里要按三次ctrl +z)
如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF
除了 %c 以外,都会⾃动忽略起⾸的空⽩字符
#include <stdio.h>
int main()
{
char ch = 'c';
scanf("%c", &ch);//这里的scanf遇到空格就会输入空格
printf("xxx%cyy\n", ch);
return 0;
}
如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表 ⽰跳过零个或多个空⽩字符。
占位符 %s下占位符 %s它的规则是,从当前第⼀个⾮空⽩ 字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。
#include <stdio.h>
int main()
{
char arr[20];
scanf("%s", arr);//这里的arr数组名是地址。 遇到空格就结束。
printf("%s\n ",arr);
return 0;
}
scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。
#include <stdio.h>
int main()
{
char arr[5];//这个给的太小会造成越界访问
scanf("%4s", arr);//在s前面加一个限制的个数可以解决上面的问题。
printf("%s\n ", arr);
return 0;
}
3.赋值忽略符
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);//必须按照格式输入 如 2024-3-5
printf("%d %d %d", year, month, day);
return 0;
}
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) * 。 只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
printf("%d %d %d", year, month, day);
return 0;
}
这样就可以不受限制了。
今天结束下班