1.getchar的应用
int main()
{
int ret = 0;
char password[20] = { 0 };
printf("请输入密码\n");
scanf("%s", password);
printf("请确认(Y/N)");
ret = getchar();
if(ret=='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
代码运行的结果出乎我们的意料,原因是什么呢?原因是:当你输入123456时电脑会自动读成123456\n,而scanf读取时只读取了123456,剩下一个\n直接被getchar读取,导致ret==\n,从而打印“确认失败”
那我们要怎么解决这个问题呢?由于getchar读取了缓冲区剩下的\n导致确认失败,那么我们只需在getchar读取前将缓冲区中的\n读取就行了。看下面的改进。
int main()
{
int ret = 0;
char password[20] = { 0 };
printf("请输入密码\n");
scanf("%s", password);
printf("请确认(Y/N)");
getchar(); //看这里
ret = getchar();
if(ret=='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
我们只需在printf后添加一个getchar把剩下的\n读取就可以很好的跑起来啦;
当然这样的代码仍有缺陷,比如我输入123 aabb
代码再次出现了问题哈,这是因为scanf读取了123而getchar读取了123之后的空格,所以之后的ret读取了aabb,从而导致“确认失败”。我们又该怎么做呢?
如果我们有个getchar能一直把缓冲区剩下的东西读取完,我们就能很好的跑下面的代码呢。所以我们加以改进
int main()
{
int ret = 0;
int ch = 0;
char password[20] = { 0 };
printf("请输入密码\n");
scanf("%s", password);
while ((ch = getchar()) != '\n')//使用一个while循环将缓冲区清空
{
;
}
printf("请确认(Y/N)");
ret = getchar();
if(ret=='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
2.getchar的其他用法
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
continue;
putchar(ch);
}
return 0;
}
利用上述代码,加上限制条件就能保证只打印数字,无法打印字母
3.for循环
int main()
{
int i = 0;
// 初始化 判断 调整
for (i = 1;i < 10;i++)
{
printf("%d", i);
}
return 0;
}
还有一种特殊情况
int main()
{
for (;;)
{
printf("hhhhh");
}
return 0;
}
若for的判断部分被省略,那判断条件恒为真,则hhhh会一直打印
还有另外的变种
可以将两个变量同时放进for循环
int main()
{
int x, y;
for (x=0,y=0;x<2 && y<5;++x,y++)
{
printf("hehe");
}
return 0;
}
4.do while循环
int main()
{
int i = 1;
do
{
printf("%d", i);
i++;
}
while (i < 11);
return 0;
}
do while 循环的特点就是先循环一次在进行循环判断