C语言重修
在这里补充我所不知道的C语言坑点
C的自带函数
Scanf( )函数相关
**简介:**scanf()函数是通过终端格式化输入函数,它从标准输入设备(键盘)读取输入信息。可以读入任何固有类型的数据并自动把数值转变成适当的机内格式。其返回值是成功读取的变量个数
- 当使用"%d%d%d"这种输入格式时,输入可以是一个空格或者多个空格、tab键、回车键分割。输出都是正确的
- “%d,%d,%d"格式与”%d%d%d"格式基本相同,不同之处在"%d,%d,%d"这种格式在输入时“,”一定要紧跟输入的数字,作为分隔符时以"%d,"为单位进行格式化读取,其他字符同理
- 字符读取时,也即"%c"输入,空格和转义字符均作为有效字符,例如
当你输入:
此时a->“1”,b->" ",c->"2"其余被丢弃,还有类似的问题,比如:
当你输入1
然后直接敲回车时,他会读取1
和[\n]
,也即c='\n'
解决办法:
- 在接收第二个数之前清空缓冲区,
fflush(stdin);getch();getchar();
随便一个都可以,fflush(stdin)
是全部清空,getchar()
是清空一个字符,如果缓冲区还有多余的字符则会被正常使用 - 在%c之前加入空格,空格可以吸收回车符、空格
- 在
scanf()
函数接收输入数据时,遇到以下问题结束一个数据的输入:
1.遇见空格,回车,跳格
2.遇见宽度
3.遇见非法输入
解决方法:使用%[]
(扫描字符集合),可以用来进行多个字符串的输入,并对结束符进行自定义。对于%[]
可以用^+
结束标志(可以使任意字符,代表着输入这个字符就终止对字符串的读取)。
比如上述代码就可以顺利读取hello world
- 神奇的缓冲区指针:
输入hello
时
你会得到一个这样的结果:
分析如下:
程序执行到第一个 scanf()
时等待用户输入,从键盘输入 hello
,按下回车键,scanf()
匹配到 hello
不是scanf()
想要的整数,所以不赋值给a,也不赋值给b,他们二者的值不动
匹配失败意味着不会移动内部的位置指针,此时缓冲区中的内容仍然是 hello
。执行到底三个 scanf()
时,它想要一个字符串,这不是正好捡漏吗,把 hello
赋值给 str 就好了。
- 不能忽略空白符的情况:
输入a=100
,程序居然直接就结束了,它与以往的程序有什么不同呢?你可以自行比较一下:
这个程序输入100
,它是会等你输入第二个scanf()
的,并且会忽略之后的空格,
但是,当控制字符串不是以格式控制符 %d、%c、%f 等开头时,空白符就不能忽略了,它会参与匹配过程,如果匹配失败,就意味着 scanf() 读取失败了。
Malloc()函数
C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。