●段错误调试
1.gcc –g 编译一下,启用GDB run命令运行一下,会提示段错误的位置
2.由于段错误编译时可以通过,遇到段错误时程序就会停止,可以在每行代码下加printf();打印部分内容,无法打印的printf();就是段错误所在位置
进阶:利用内置宏printf(“%s:%d”,_func_,_LINE_);(在每行代码下加)
输出:main:9 (表示段错误在main文件第9行)
●声明和定义的区别
定义:1.需要分配内存空间
2.只能定义一次 e.g. int num;
声明:1.不分配内存空间,告知编译器这个变量已经开辟内存,提高编译速度
2.可以声明多次
变量的声明分类:1.定义性声明:需要开辟内存 int num;声明时建立存储空间
2.引用性声明:不需要开辟内存 externa int num;num在别的文件已经建立存储空间
●格式控制输入输出:
1.scanf(”%d,%d”,&a,&b) scanf每次遇到空格或回车结束一次录入
2.“%d”称为占位符,也叫格式说明符,表示这里将被其他数据取代
3.没有取地址符&出现段错误的原因:只有变量名无法获得唯一的地址,因为存在变量重名(地址具有唯一性)
4.不常用变量类型:长整型: %ld
double: %lf
获得地址:%p
八进制: %o(直接显示八进制:e.g.144)
%#0(C标准显示八进制e.g. 0144)
十六进制:%x(直接显示十六进制:e.g. 64)
%#x(C标准显示十六进制e.g. 0x64)
%#X(……………………………………….0X64)
案例:当前面为scanf为整型,下一个scanf为字符时,后面的scanf会获得\n,因为输入第一个scanf时会输入回车,会被下一个scanf读取到
解决方法:1.二者之间加一个getchar()函数(只能读取一个字符,用来把\n读取走)(遇到两个scanf,下一个直接自动输入时就用getchar()放两者之间)
2.scanf(“ %c”,&ch); 加一个空格
3.scanf(“%*c%c”,&ch); 加%*c
●gets()函数警告的原因,它没有缓冲,也就是没有上限,容易造成数据溢出
例如char src[10];
gets(src)可以输入任意长度,回车后报错
作业
1.用scanf怎么输入一个句子可以遇到空格不结束
2.解决用gets输入指定长度密码(字符数组)报错