1.getchar的应用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
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;
}

9月23日c语言学习小结_初学者

代码运行的结果出乎我们的意料,原因是什么呢?原因是:当你输入123456时电脑会自动读成123456\n,而scanf读取时只读取了123456,剩下一个\n直接被getchar读取,导致ret==\n,从而打印“确认失败”

那我们要怎么解决这个问题呢?由于getchar读取了缓冲区剩下的\n导致确认失败,那么我们只需在getchar读取前将缓冲区中的\n读取就行了。看下面的改进。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
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读取就可以很好的跑起来啦;

9月23日c语言学习小结_初学者_02

当然这样的代码仍有缺陷,比如我输入123 aabb9月23日c语言学习小结_初学者_03

代码再次出现了问题哈,这是因为scanf读取了123而getchar读取了123之后的空格,所以之后的ret读取了aabb,从而导致“确认失败”。我们又该怎么做呢?

如果我们有个getchar能一直把缓冲区剩下的东西读取完,我们就能很好的跑下面的代码呢。所以我们加以改进

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
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;
}

9月23日c语言学习小结_初学者_04

2.getchar的其他用法

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')
continue;
putchar(ch);
}
return 0;
}

9月23日c语言学习小结_初学者_05利用上述代码,加上限制条件就能保证只打印数字,无法打印字母

3.for循环9月23日c语言学习小结_初学者_06


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 0;
// 初始化 判断 调整
for (i = 1;i < 10;i++)
{
printf("%d", i);
}
return 0;
}

还有一种特殊情况


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
for (;;)
{
printf("hhhhh");
}
return 0;
}

若for的判断部分被省略,那判断条件恒为真,则hhhh会一直打印

还有另外的变种

可以将两个变量同时放进for循环

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x, y;
for (x=0,y=0;x<2 && y<5;++x,y++)
{
printf("hehe");
}
return 0;
}

4.do while循环

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d", i);
i++;
}
while (i < 11);
return 0;
}

do  while 循环的特点就是先循环一次在进行循环判断