今天中午知道要爆肝的C语言的,今天本来作业好多的;
干了,家人们
做一些补充:
一:printf() 参数与占位符对应关系
printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。(就是针对原语句也是一个参数)
二:新学的%s,%e,%x的用法:
用于 printf
和 sprintf
等函数中,以表示一个字符串。当你在一个格式化字符串中使用 %s
时,你告诉函数期望一个指向字符数组(或字符串)的指针作为参数,以便在输出中替换 %s
。
其他的占位符用法
占位符列举
printf() 的占位符有许多种类,与 C 语⾔的数据类型相对应。下⾯按照字⺟顺序,列出常⽤的占位
符,⽅便查找,具体含义在后⾯章节介绍。
• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。
• %d :⼗进制整数。// int
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。//float %f double - %lf
• %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 类型。
• %lx :⼗六进制 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 :⽆符号整数(unsigned int)。
• %x :⼗六进制整数。
• %zd : size_t 类型。
• %% :输出⼀个百分号。
举几个例子:
%e
是用来格式化输出浮点数的科学计数法表示的格式化字符。
%e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
{
double e = 12345.6666666666666666;
printf("输出为%e", e);
return 0;
}
%x :⼗六进制整数:
打印出为f:
{
printf("输出为:%x", 15);
return 0;
}
三:限定宽度
鉴于这两种输出的样子不一样,所以经行限定宽度:
printf输出首先右对齐
{
printf("输出为:%5d\n", 123);
printf("输出为:%-5d\n", 123);// printf("输出为:%-5d\n", 123); 这一句话是向左对齐
printf("输出为:%d\n", 123);
}
%*.*f 的使用规则:
printf("%*.*f\n", 6, 2, 0.5);: 这是printf函数的调用,用于输出格式化的字符串。这里的格式化字符串是"%*.*f\n",其中包含了两个星号(*)作为字段宽度和小数点后的精度的占位符。这两个占位符的值由后续的参数6和2提供。
第一个星号(*)对应的是6,它表示整个浮点数的总宽度(包括小数点和小数部分)应为6个字符宽。如果实际宽度小于这个值,输出将被空格填充以达到这个宽度。
第二个星号(*)对应的是2,它表示小数点后应显示两位数字。如果原始浮点数的小数部分有多于两位的数字,它们将被四舍五入到两位;如果少于两位,将用零填充。
{
printf("输出为:%12.1lf\n", 12.12);
printf("输出为:%*.*lf\n", 12, 1, 12.12);
}
%.[m]s 的详解:
{
printf("输出为:%s\n", "abcdef");
printf("输出为:%.3s\n", "abcdef");
}
四:又回到scanf
在VS中出现scanf和scanf_s的报错问题:
使用everything来操作:
下载链接 下载 - voidtools
搜索:newc++file.cpp
使用记事本打开,然后添加语句
#define _CRT_SECURE_NO_WARNINGS 1
下次打开就出现这段语句:
输入的数值放在缓冲区域
一步一步读取,浮点数在内存中无法精确的保存。
针对输入-13.45e12# 0 的详解:
第一种还正常1:
{
int a;
float b;
scanf("%d" ,&a);
printf("输出为:%d\n", a);
scanf("%f", &b);
printf("输出为:%f\n", b);
return 0;
}
输入: -13.45e12# 0
首先读取到-13,后面到 . 停止赋值给小数0.45的12次方
但对于第二种:
{
int a;
float b;
scanf("%d %f", &a, &b);
printf("%d %f\n", a,b);
return 0;
}
留下了问题:
一种解释:
首先,scanf 会尝试读取一个整数(%d),但输入字符串 -13.45e12# 0 开头部分 -13.45e12 并不是一个有效的整数格式,因为它包含了小数点和小数部分以及科学计数法表示。因此,scanf 无法正确读取整数,变量 a 将不会被赋予任何确定的值(它可能会保持之前的值,或者如果是局部变量且未初始化,则结果是未定义的)。
接下来,scanf 会尝试读取一个浮点数(%f)。由于 -13.45e12 是一个有效的浮点数表示(科学计数法),scanf 将能够成功读取这个值并赋值给变量 b。# 0 部分将被留在输入缓冲区中,因为 %f 格式说明符只读取一个浮点数。
然后,printf 函数将尝试输出变量 a 和 b 的值。由于 a 没有被成功赋值,它的值是未定义的,输出将是不确定的。而 b 的值将是 -13.45e12,即输入的浮点数。
因此,如果 a 变量没有被正确初始化,输出将是不可预测的,可能会是垃圾值(对于 a)和 -13.45e12(对于 b)。如果 a 变量有默认值(比如全局变量或静态变量在某些编译器和设置下可能有0作为默认值),那么输出可能会是这个默认值和 -13.45e12。
第二种解释;
int a; float b; - 这两行声明了两个变量,一个是整数类型的变量a,另一个是浮点数类型的变量b。
scanf("%d %f", &a, &b); - 这行代码使用scanf函数从标准输入中读取两个值,一个整数(%d)和一个浮点数(%f),并将它们分别存储到变量a和b中。&a和&b分别表示变量a和b的地址。
printf("%d %f\n", a,b); - 这行代码使用printf函数将变量a和b的值打印到标准输出。%d和%f分别表示打印整数和浮点数,\n表示换行。
在你提供的输入 -13.45e12# 0 下,会发生以下情况:
-13.45e12#会被读取为一个浮点数,并且scanf函数在解析时会遇到无效字符#,此时解析停止。由于scanf在解析时会将无效字符留在输入缓冲区中,所以#会保留在输入缓冲区中而不被消耗掉。
0会被成功读取为一个整数,并存储在变量a中。
因此,由于无效字符导致scanf函数解析中断,浮点数-13.45e12#不会被正确赋值给变量b。在printf函数中,变量a的值是0,而变量b由于没有被正确赋值,所以其值在此时是未定义的。因此,输出结果是 0 未定义。
主要就是读取错误,以后不这样写就ok了
scanf有返回值:
ret就是输入的放回值:
scanf里%c跳空白字符,
scanf里使用占位符%c,要多留个心眼——,空白字符会被吃掉:
下面这种情况下就不会读取到数据:
但可以改进%c前面加 空格,也嫩达到效果
scanf里使用%s,遇到空白字符会停止读好之后,存储到变量里后会自动存储'\0'
所以使用%[m]s来限制输入长度:
{
char arr[5] = {0};
scanf("%4s", arr);
printf("%s", arr);
return 0;
}
赋值忽略符
%*c(如图示)
创建变量要给初始值
这意味着它们可能包含任意的垃圾值,这样的变量可能会导致程序的不确定行为,甚至是错误。
五:if语句:
执行流程:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
if后面默认是认定一条语句,需要一个逻辑控制多条语句这样弄:
嵌套if else
无限嵌套:
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("青少年");
}
else if (age<=44)
{
printf("中年");
}
else if (age<=59)
{
printf("中老年");
}
else if (age<89)
{
printf("老年");
}
else
{
printf("老寿星");
}
}
转化为:控制一个语句
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("青少年");
else if (age <= 44)
printf("中年");
else if (age <= 59)
printf("中老年");
else if (age < 89)
printf("老年");
else
printf("老寿星");
}
else悬空问题:
else 与最近的if进行匹配,(O_o)??什么都不会输出
干干干这篇文章三个小时半了
下次还是得写简洁点