getchar和putchar
这里我们来介绍一下getchar和putchar。
getchar()作用是是获取(输入)一个字符。函数不接受任何的参数。——scanf
getchar读取字符成功的时候,返回字符的ASCLL码值。
读取失败或者遇到文件末尾的时候就返回EOF(-1)
putchar()作用是输出一个字符。——printf
使用1
//windows环境按ctrl+z getchar返回EOF #include <stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) { if (ch < '0' || ch > '9') continue; putchar(ch); //打印0~9的字符 } return 0; }
放张图方便以后复习🙂绝望了,怎么还没写完,反正也没人看!好烦,我爱写代码!
使用2
解析来我们用一个例子来循序渐进的讲解。🆒
关于下面这段代码为什么会出现读取失败的原因呢???
解释如下🙂🙂🙂
#include<stdio.h> int main() { char password[20]; printf("请输入密码:"); scanf("%s", password);//数组名本来就是地址不用取地址 //第一次scanf读取了缓存区的xgdtaq 留下了\n(回车)再缓存区。 printf("请确认密码(Y/N):"); char ch=getchar();//getchar只能读取一个字符 //当getchar读取字符的时候正好看到\n(回车算一个字符)就读取成功了 if (ch == 'Y') printf("确认成功"); else printf("确认失败"); //getchar读取到的\n≠"Y"就输出确认失败 return 0; }
此刻,我们需要再getchar读到\n时清空缓存区。所以我们需要在前面加入一个getchar。
但是如果我们想选用空格当作密码之一呢?
依然说确认失败,为什么呢?
因为scanf函数遇到空格就不在读取了,那我们可以在多加几个getchar就解决问题了,可是我们如果不知道输入的人想要在空格后输入多少位字符,所以这里我们又要用到我们的循环!!!
#include<stdio.h> int main() { char password[20]; printf("请输入密码:"); scanf("%s", password);//数组名本来就是地址不用取地址 while (getchar() != '\n');//循环条件 //增加一个循环,直到getchar读到\n,清空缓存区 { ; //表示这里有一条语句,需要这条空语句,什么都不干。 } printf("请确认密码(Y/N):"); char ch=getchar();//getchar只能读取一个字符 if (ch == 'Y') printf("确认成功"); else printf("确认失败"); return 0; }
以上代码就实现了清空缓存区。
for循环
语法结构
//for循环的语法结构
//for循环的语法优于while且用的很多
//循环安顺序需注意
for(表达式1;表达式2;表达式3)
循环语句;
使用for循环 在屏幕上打印1 - 10的数字 #include<stdio.h> int main() { int i = 0; while (i < 10) { i++; printf("%d ", i); } return 0; } //第一种 #include<stdio.h> int main() { int i = 1; while (i <= 10) { printf("%d ", i); i++; } return 0; } //第二种 #include<stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) printf("%d ", i); return 0; } //第三种 //特点:初始化只执行一次
for循环中的break
//break在for循环中也是终止循环的作用 //while和for循环中break作用一样,只要遇到break都是终止循环。 #include<stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i == 5) break; printf("%d ", i); } return 0; }
for循环中的continue
//在for循环中的continue,直接跳过continue后面的代码,来到for循环中的调整部分 //和while循环中的continue有区别 #include<stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i == 5) continue; printf("%d ", i); } return 0; }
建议
1.我们在for循环体内部尽量不修改循环变量。 如果我们在循环体内部去修改循环变量,很可能导致得 不到想要的结果,从而导致死循环。
人会有以下写法,虽然它很简便,但是它有弊端。所定义的变量出了循环体就不能使用了。
#include<stdio.h> int main() { //C99时引出的写法 for ( int i = 1; i <= 10; i++) { printf("%d ", i); } //弊端就是i只能在循环体内部使用 //出了循环体就不能使用了 return 0; }
2.我们建议for循环的循环体采用"前闭后开区间"的写法。来看看对比,那个更容易理解?
//建议2.在for循环中尽量采用“左闭右开”的方法 //用数组和for循环打印1~10的数字 //左闭右开 #include<stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int i = 0; for (i = 0; i < 10; i++)//数组下标从0~9 //【0,10) printf("%d ", arr[i]);//打印下标即可 return 0; } //全闭 #include<stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int i = 0; for (i = 0; i <= 9; i++) //【0,10】 printf("%d ", arr[i]); return 0; }
for循环的变种
这里我们还有一个练习题,搞一下????
请问循环要循环多少次? #include <stdio.h> int main() { int i = 0; int k = 0; for(i =0,k=0; k=0; i++,k++) k++; return 0; }
——————————————-——→0次,看清楚for循环中判断条件是k=0,是赋值不是判断,意为把0赋值给k,表达式为假不进入循环
do while循环
语法结构
do
循环语句; //循环语句若为一条可不要{},反之有多条,必须加上{}
while(表达式); //表达式为真继续循环,为假跳出循环
//注意不要遗漏了后面的的分号
语法特点
do while循环至少执行一次,使用的场景有限,所以不是经常使用。
#include<stdio.h> int main() { int a = 0; do { a++; printf("%d ", a); } while (a < 10); return 0; } //循环至少执行一次,使用的场景有限,所以不是经常使用
do while循环中的break
break: 终止循环的作用。
#include<stdio.h> int main() { int a = 0; do { if (a == 5) break; a++; printf("%d ", a); } while (a < 10); return 0; }
do while循环中的continue
continue:终止本次循环。跳过本次循环后面的代码,直接去判断部分。
#include<stdio.h> int main() { int a = 1; do { if (a == 5) continue; printf("%d ", a); a++; } while (a < 10); return 0; }
go to语句
关于goto语句我们介绍三个点。
用法
跳转到前面:
#include<stdio.h> int main() { printf("1111 "); printf("2222 "); flag: printf("3333 "); goto flag; printf("4444 "); printf("5555 "); printf("6666 "); return 0; }
跳转到后面:
#include<stdio.h> int main() { printf("1111 "); printf("2222 "); printf("3333 "); goto flag; printf("4444 "); printf("5555 "); flag: printf("6666 "); return 0; }
适用
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过 程,例如一次跳出两层或多层循环。 这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
//真正适用场景如下 for(...) for(...) { for(...) { if(disaster) goto error; } } … error: if(disaster) // 处理错误情况
【在下面一篇文章中我们将继续介绍goto使用在一个关机程序上,可以先动手写写。】
提醒
NO1-----以上所有无论分支和循环语句,都只能控制一条语句,所以在写一条及多条语句的时候一定要加上{ }
NO2-----关于break和continue,请一定仔细判断,看好边界条件,才能得出正确答案✔✔✔
NO3-----关于==和=,等于和赋值我们一定要判断清楚,才不会把程序搞错。🙂🙂
✔✔✔✔✔最后,感谢大家的阅读,欢迎大家指针不足和错误!!🙂🙂🙂🙂
代码------→【gitee:https://gitee.com/TSQXG/c.start】
联系------→【邮箱:2784139418@qq.com】