关于scanf与scanf_s
为什么scanf不安全
int main()
{
char * pszPassWord = "123456";
char arry[10] = {};
int nCount = 0;
scanf("%s", arry);
int IsKey = strcmp(pszPassWord, arry);
if (IsKey == 0)
{
printf("密码正确\r\n");
}
else
{
printf("密码不正确\r\n");
}
return 0;
}
以上代码如果用户输入过长就会产生中断
我们可以限制用户输入
scanf("%9s",arry);
ccc烫烫 是堆栈没有初始化
但是以上的操作不是语法级别的 就是不是必要的操作
所以为了安全发明了scanf_s
scanf_s
他与scanf的最大区别在于scanf_s多了一个参数
这个参数是限定用户输入的缓冲区的大小。
如果实际输入超过限定就会,丢弃多余的数据
scanf_s("%s", arry, 10);
scanf中%c和%d的区别
scanf是一个格式化输入的函数,到底是什么意思呢?其实是数据化的格式化
%C将输入的数据转化为char类型输入
先从printf了解 格式化转化:
int main()
{
char chValue = '5'; // 在内存中 是 cc cc cc 35
printf("%d\r\n", chValue); //将内存中35 用%d表达出来是 53
printf("%x\r\n", chValue);//十六进制表达出来 就是35
printf("%c\r\n", chValue);//单个char字符 就是5
return 0;
}
我们对比以下两种情况
int main()
{
int nValue1 = 0;
int nValue2 = 0;
scanf("%d", &nValue1); //内存情况 00 00 00 05
scanf("%d", &nValue2);//内存情况 00 00 00 05
printf("%d\r\n", nValue1 + nValue2);
return 0;
}
```c
第二种
两个5 5
```c
int main()
{
int nValue1 = 0;
int nValue2 = 0;
scanf("%c", &nValue1);//按照 char类型存入 内存 就是 00 00 00 35
scanf("%d", &nValue2);//存入 5
printf("%d\r\n", nValue1 + nValue2); //char类型的变成 %d类型的输出 就是53 加上后面的5 结果就是为58
return 0;
}
以上就是nValue1转为char类型 printf将char类型转化为%d类型
fflush(stdin)
sscanf
如何输入的东西是数字 又可以判断字母
sscanf
他的输入 是已经准备好的字符串
sscanf(buff,"%d",&nValue);
buff是键盘输入,对后面格式化
已经输入的数据 buff
按照%d对于buff处理存在 nValue里面
int main()
{
char arry[10] = {};
int nValue = 0;
scanf("%s", &arry);
if (arry[0] == 'q')
{
printf("YSE\r\n");
}
else
{
sscanf(arry, "%d", &nValue);
printf("%d\r\n", nValue);
}
}
建议使用空格作为缩进,而不是tab
if语句
if是分支语句之一,它通过判断条件,决定走那条分支
if(表达式)
{
表达式为真的时候
}
else
{
表达式为假的时候
}
C语言中的表达式
表达式就是可以计算的式子 (加减乘除)
在if中为了简化
- 非零值为真
- 零值为假
括号表达式
if
else
括号带上
把括号最后面的为表达式
printf("%d\r\n",(10,0,5));
//结果为5
switch
switch是另外的分支结构
switch 里面只能是char 与 int
不能是double float等
基本语法
switch(int or char)
{
case 0:
语句1;
break;
case 2:
语句2;
break;
... ...
default:
break;
}
如果去掉 break 就会执行完满足条件以后 会执行下面的语句
直到break出现
课堂娱乐
通过winhex,可以认识到源码和机器码的关系,内存布局的关系(字符串是在全局 区)。