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