4月4日今日预告:printf+scanf+分支循环,if语句,else悬空问题,加油,干干干这篇文章三个小时半了,从愚人节被告知今天就有课程-今日4/3,

 

今天中午知道要爆肝的C语言的,今天本来作业好多的;

干了,家人们

做一些补充:

一:printf() 参数与占位符对应关系

printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。(就是针对原语句也是一个参数)

7b342eaf4d6541dfb8be8b3827b3faeb.png

 

二:新学的%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的报错问题:

dd1529e08ae942f7abd8bbc890437e72.png

使用everything来操作:

下载链接     下载 - voidtools

搜索:newc++file.cpp

使用记事本打开,然后添加语句

#define _CRT_SECURE_NO_WARNINGS 1

下次打开就出现这段语句:

b5d341f3a3a74440875cad7a8d1bd501.png

输入的数值放在缓冲区域

一步一步读取,浮点数在内存中无法精确的保存。

针对输入-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

9f30d96d08364e84b60eaabd07ed1e60.png

首先读取到-13,后面到     .   停止赋值给小数0.45的12次方

但对于第二种:

{
    int a;
    float b;
    scanf("%d %f", &a, &b);
    printf("%d %f\n", a,b);
    return 0;
}

留下了问题:

b083e423c9ca4a11940fa06d6b0d0df3.png

一种解释:

首先,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就是输入的放回值:0e8b1ad3b2c44c7382bf52969d405333.png

scanf里%c跳空白字符,

scanf里使用占位符%c,要多留个心眼——,空白字符会被吃掉:

8aff1448507f4497a9f38637bfdf4083.png

下面这种情况下就不会读取到数据:

9d4be097c90b471692a0266c682255c4.png

但可以改进%c前面加   空格,也嫩达到效果

dc359cdf50ba4529b4df3253ba1deb0a.png

scanf里使用%s,遇到空白字符会停止读好之后,存储到变量里后会自动存储'\0'

所以使用%[m]s来限制输入长度:

{
    char arr[5] = {0};
    scanf("%4s", arr);
    printf("%s", arr);
    return 0;
}

7447c9ab33034fb7b2637e297e266546.png

 赋值忽略符

%*c(如图示)

dcde76c324214e4386e26f5d0e58be4f.png

 创建变量要给初始值

这意味着它们可能包含任意的垃圾值,这样的变量可能会导致程序的不确定行为,甚至是错误。

五:if语句

执行流程:

5f269353bd2e488892eee9a5fdf6433a.png

#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后面默认是认定一条语句,需要一个逻辑控制多条语句这样弄:

f7e4cf7cb4c04c1aba1ea4e123d3de9a.png

嵌套if   else

4617f3006e7e4462bfde2f0b1e818550.png

无限嵌套:

0050c70d241b44c1bce7a9d83eef1fb6.png

{
	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悬空问题:

c8f1b85f55a44a70afe5942fdcc54251.png

else 与最近的if进行匹配,(O_o)??什么都不会输出

干干干这篇文章三个小时半了

下次还是得写简洁点

 

  • 51
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值