- 博客(25)
- 收藏
- 关注
原创 张阿姨的烦恼
该程序中scanf要求读取到十进制整形,而字符类型的 ` 并不匹配,因此scanf在缓冲区中读取为0,也导致 ` 在缓冲区中一直存在,因而不会发生阻塞.1.问题描述:张阿姨开了一个炸鸡店,想写个程序来计算客人应付的金额,偶然发现输入“ · ” 时,会停不下来。背后到底发生了什么呢?请你给出对应的问题分析报告,并给出你的解决方案。printf("鸡腿数量:");
2023-09-19 20:38:14
147
1
原创 scanf的阻塞和缓冲区
(1)*代表不赋值,^代表跳过,[]为集合,第一个scanf的输入格式带来的效果:会清除缓冲区内非数字,然后第二个scanf可以正常输入,达到某些情况下本只想要获得数字而意外输入非法字符带来的错误(如用程序计算金额)回车符代表\r和\n(好像是,没找到准确回答),再输入第一个数据之后,再按回车,刚好符合scanf的输入格式,即清空了缓冲区,接着发生了阻塞,所以此现象会发生在任何类型。scanf("%*[^\n]%c"),%c会匹配并储存一个字符,可以起到跳过行尾换行符的作用(个人理解是%c于的格式相对应)
2023-09-19 18:53:23
515
原创 strlen和sizeof
另外:像(2)定义的数组若[]中放入数字,编译器会在多余的内存中放入0,并且计入大小。由此可以看出:(1)类型定义的数组在初始化时自动放入 \0。sizeof求的是所占空间的大小。strlen求的是字符串长度。依次输出为4,3,3,3。
2023-09-16 22:04:30
80
原创 9.10C
1.0XAA表示十六进制unsigned int类型的数据,对于八进制和十六进制,系统优先解释为无符号类型。而且若给与数组大小,sizeof输出为数组大小的给定值,如sz3,而是strlen不会。对于{}表示的数组,不计算\0,对于""表示的数组,计算 \0,并以位的方式输出。另外:sizeof在运算类型时一定要圆括号,运算特定量时圆括号可有可无。读取到\0才停止(不包括\0),输出为字符(包括标点和空格等)2.arr和&arr对应的地址值一样,但 意义不一样。}输出为3,3,10,4,3。
2023-09-10 22:44:46
68
1
原创 递归
思考方式:首先得到该多位数的每一位:可以通过除法,取商或余,要求依次输出,故取商,如123,可以轻易剥离3。(1)要求:输入一个多位数,分别依次(高位到低位)输出这个多位数的每一位。1.递归定义:程序调用自身的编程技巧成为递归.会出现stack overflow(栈溢出)要求:不创建临时变量,计算字符串长度。递归的主要思考方式:大事化小。
2023-09-09 17:52:15
44
1
原创 循环求字符串长度
3.结合循环可以获取到数组中的每个字符。4.计算长度可以想到以'\0'结束循环。1.arr传递过去的为首字符的地址。2.用*arr的方式获取到首字符。
2023-09-09 11:57:48
165
1
原创 case和逻辑或||,年份第几天问题
原因(个人):运行之前将该带有逻辑或的运算符默认为1(可能是为契合case后为常量),所以那两行实际为两个case 1。printf("%d年%d月%d日", year, month, day);改法:将case分开写,或者用if代替switch语句。printf("请输入时间\n");
2023-09-07 22:56:46
49
1
原创 组成无重复的三位数
2.遍历(按照特定次序访问数据元素的过程),大多用到循环。优解:int a,b,c分别为三位数的各位。例如:int a=132;要求:每个数在一到四之间。十位:a%100/10。
2023-09-07 16:29:34
42
1
原创 9.6 C
输出为43 3 2,原因:printf的返回值为打印的字符个数(函数的返回值可以在cplusplucs网站中查看)而unsigned作用之后,符号位变为数据位,也变为了正数,而正数三码统一,所以输出为补码。例如:#include "add.h"(引用库函数用<>,自己写的用"")++的优先级高于*,所以会先++,从而导致*p并没有改变p的大小。反码:1111111....0(反码的符号位不取反)源码:100000.....1。补码:1111111....1。4.goto语句的实现。
2023-09-06 22:51:21
50
1
原创 9.4 c
形参只是实参的一份临时拷贝,形参和实参之间没有实际联系,对形参的改变不会引起实参的改变,所以不会达到...的效果。不能实现的原因:arr传过去的是第一个元素的地址,所以形参arr是一个指针,而指针大小为四字节。//*pa即通过pa里的地址,找到a的内容;printf("找到了,下标是%d",ret);printf("找到了,下标是%d",ret);sqrt(n)用来算n的平方根,要引用math.h。printf("找不到");printf("找不到");
2023-09-04 23:02:30
64
1
原创 9.3 C
三.若引入 complex.h 的头文件,可以把complex,imaginary分别代替_complex和_Imaginary。上溢:当计算导致数字过大,超过当前类型表达的范围,会发生上溢,printf后输出inf or infinity。一.复数:float_complex,double_complex,long double_complex。float_complex类型的变量应包含两个float类型的值,分别表示复数的实部和虚部。例:double_complex cmp =1.3+2.3*I;
2023-09-03 23:00:32
66
原创 9.2 C
long 用%ld //根据计算机系统的不同可能不同,在int与long位数相同的系统中long可以用int,但这样的程序不具有可移植性(若在不同位数的系统)输出得到E,解释:定义的字符常量'FSTE',即把4个独立的ASCII码储存在32位储存单元中,而赋值给char类型的a,只能接收后8位,即E。B对应的ASCII值66本会储存在32位的储存单元中,而现在储存在8位储存单元中(所以会有%d和%c的两种打印结果)而%hd只会读取后面的16位(int为32位,short为16位的系统中)
2023-09-02 21:59:38
64
原创 9.1 C
当达到最大值时,会从起始值重新开始(溢出在c语言中属于未定义行为,以下情况只是典型,可能其他)1.%f %.2f中 .2 用于精确控制输出,指定输出的浮点数只显示小数点后两位。3.c语言把不含小数和指数的视为整形,3.14E7不是整形。0O表示八进制的前缀,也可以是空格加上0,即" 0"一个数字,字母,标点,符号为八位(第八位表示正负)十进制用%d,八进制用%o,十六进制用%x。负数的补码为负数的绝对值的各个位取反加1。例:3.14E 表示3.14*10^7。0x或0X表示十六进制的前缀。
2023-09-01 23:03:24
82
1
原创 8.29 C
一.printf("There are %d feet in %d fathoms",mouse,famous)二.printf("There is %d feet",6*famous)//即后面部分不一定为变量。1.有效命名中名称第一个字符必须是下划线或者 字母。第一个void表示该函数没有返回值。/b 代表Backplace。void:空白,无效的。2./t 代表Tab。
2023-08-29 23:08:06
79
1
原创 c语言 7.18
仍然可以输出snnd,原因:在括号里会先执行左边,为假,即为0,所以右边成立。也就包括case后的亦为整形常量,或是输出整形常量的表达式。如果条件成立,且要执行多条语句,要用大括号括起来。else和离得最近的,未被匹配的if相匹配。switch()的括号内必须是整形常量。
2023-07-18 23:16:45
74
原创 c语言 7.17
声明外部函数:extern int Add(int,int)(1)第一行:取一个空间a,存放10,地址为........(3)第三行:*为解引用操作符,将存入的10改为了20。int* p=&a;(其他类型字符出现char*等)1.意义:即打印地址,(打印出来的为16进制)语法:#define Max 100。2.指针变量:一种用来存放地址的变量。(2)第二行:将a的地址存入p。那么以后的Max全变为100。
2023-07-17 23:14:00
121
原创 代码的实例
一.比较函数if (x > y)return x;elsereturn y;int main()int a = 15;int b = 16;return 0;二.求和(1)return sum;int main()return 0;(2)int main()return 0;int n = 10;n = 20;return 0;
2023-07-17 12:01:46
176
原创 c语言 7.16
输出的时候是将补码转化成原码输出。int a=3.14,输出会警告,因为3.14属于double类型。所以,a:00000000000000000000000(32位)printf("%d\n",b)输出为10,输出a为11。理解:摘自度娘回答:首先数据在计算机中存储的是。五.条件操作符(p4 1:04:28)例:int sum=Add(a,b);int a=(类型)3.14 可。(1)&&:逻辑与,即全真为1。(2)||:逻辑或,即有真则真。所以为-1(0为正,1为负)(类型):强制类型符转换。
2023-07-16 23:52:16
91
原创 c语言 7.13
(1)先对1转为二进制1,补全比特位,即000...001(共32位)3.printf("%d\n",arr1[])在[]中输入下标。所以printf("%d\n",arr1[4])输出为5。^ 换位异或:相同为0,相异为1(同假异真)printf("%d\n",c),输出为13。& 换位与:二进制,全1为1,其余为0。printf("%d\n",b)输出为2。(2)<<之后,为0000..0010。5%2 输出为1,即取模(余数)5/2 输出为2,即取商。计算机中0为假,非0为真。
2023-07-13 22:33:13
53
原创 关于进制
2.其他进制转十进制:如二进制132,转出为:2x2^0+3x2^1+1x2^2=12。1.十进制转二进制:除以2,如259转二进制为100000011,记得余数从右往左排。4.二转十六,每四位可以(3和4都是先把分开的按照2的次方乘起来再相加)3.二转八,由于2^3=8,所以每三位二进制可以转化为一位八进制。
2023-07-12 23:04:29
163
1
原创 c语言 7.12
所以对于char arr1[]="abc"和char arr2={'a','b','c',0}两者的输出才一致。\ddd:ddd表示1~3个八进制的数字转化为十进制后对应的ASCII表中对应的字符。1.字符串:双引号引起的一串字符,如"abcde"," "表示空字符。另:对字符串"abc",其实是在末尾隐藏了结束标识'\0'存放字符串:char arr1[]="abc"也可放入'\0',相当于主动放入结束标识。2字符串的打印:"%s"a."\"具有转义的作用。将abc存入"[]"中。
2023-07-12 22:34:18
87
原创 c语言 7.11
(1)如对于输入函数,scanf来自c语言,而scanf_s来自于vs,因scanf具有可移植性(跨平台性),所以尽量用scanf_s(很多c语言库的函数都被vs认为具有危险性)(2)规避此警告:1.复制warning中use后的部分,在#include之前加:#define+复制部分(有一个空格)例:scanf("%d%d",&num1,&num2)(&为取地址,是否可以理解为上述定义的num1 num2,被取入)4.const:修饰的常变量(但仍为变量,而具有常属性)(1)"%"表示打印。
2023-07-11 22:39:06
99
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人