本人0基础开始学编程,我能学会的,你也一定可以,学会多少写多少。
下载安装请从官网入手,社区版本即可,这里主要使用的软件是VS2019,图标如下。
上一篇:从0开始学c语言-11-if分支语句、switch分支语句_阿秋的阿秋不是阿秋的博客-CSDN博客
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成, C 语 言有九种控制语句,可以分为以下三类:
1. 条件判断语句也叫分支语句: if 语句、 switch 语句;
2. 循环执行语句: do while 语句、 while 语句、 for 语句;
3. 转向语句: break 语句、 goto 语句、 continue 语句、 return 语句。
目录
循环执行语句
while语句
语法结构
执行流程
代码演示
学点新知识(getchar、putchar、缓冲区)
缓冲区
利用它整点新活
ASCII码表的应用
上一篇我们学了分支语句,分别是if语句和switch语句,这两个语句都是执行一次,而在程序设计中,我们还需要面对很多情况,于是循环执行语句就出现了。
//while语法结构
while(表达式) //表达式结果为真则执行循环语句
循环语句;
int main()
{
int a = 0;
while (a <= 10)
{
//if (a == 5)
// break; //在while循环中,break用于永久的终止循环
if (a == 5)
continue; //continue跳过本次循环它之后的语句
//来到while语句的表达式部分,判断是否进行下一次循环
printf("%d\n", a);
a++;
}
return 0;
}
注释掉的break部分打印结果是0 1 2 3 4。
continue部分打印结果是0 1 2 3 4 死循环。
从这段代码中我们学到的是:
1.while循环语句中的break是用于永久终止循环的。
2.while循环语句中continue跳过本次循环它之后的语句,来到while语句的表达式部分,判断是否进行下一次循环。
getchar()是指从键盘(也就是标准输入)获取一个字符,返回类型是int类型,正确读取返回的是读取到字符的ASCII码值,读取错误或者读取结束会返回EOF。简单点就是说打印从键盘获取的一个字符。
EOF是文件的结束标志 end of file,代码中敲出EOF 右击选中转到定义,它的意思代表-1。putchar()输出一个字符,这是一个函数,括号内是函数调用参数。
int main()
{
int a = getchar();
printf("%c\n", a); //输入两个h只会打印一个h
putchar(a); //输出一个字符,这是一个函数,括号内是函数调用参数
return 0;
}
上面那段代码也可以这么写
int main()
{
int b = 0;
b = getchar();
putchar(b);
return 0;
}
现在我们加上一个循环。
int main()
{
int a = 0; //运行想结束的话,按ctrl+z后回车
//ctrl+z让getchar读取到EOF
while ((a = getchar()) != EOF)
{
putchar(a);
}
return 0;
}
这样就可以打印很多个字符啦!
细心的小伙伴有没有发现,每次回车输出之后再重新输入字符的时候自动换行了呢?
讲一下缓冲区
getchar和键盘输入之间有个缓冲区,你可以理解为字符们的停车场,在这里排队等着被输出。
getchar和键盘之间有个缓冲区,比如你输入a并敲回车等着输出,那么在缓冲区会是a\n,getchar先读取到a并打印出来,再返回到缓冲区读取下一个字符,也就是\n,打印后就会换行。
这就是为什么每次会自动换行的原因。
//这里用scanf_s代替的同学,这个代码会报错
//scanf_s要求在输入char或字符串数组时,添加最大长度作为参数
//所以应该是scanf_s("%s", password,20);
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password); //password本来就是地址,所以不需要取地址
printf("请确认密码,输入Y or N\n");
int aqiu = getchar();
if ('Y' == aqiu) //注意字符加单引号
printf("ok");
else
printf("wrong");
return 0;
}
很奇怪,我们还没有确认呢,怎么就直接错误了呢?
这又和缓冲区有关系啦!
回车会触发scanf读取内容,回车在缓冲区就是\n,敲下回车会把键盘按出来的信息放到缓冲区里,然后scanf才会读取信息,scanf读取信息的时候不会读取\n,getchar这时候来到缓冲区看到了\n,于是直接拿走。所以我们连确认密码的机会都没有了。
那好吧,我们改进一下。
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认密码,输入Y or N\n");
getchar(); //清理缓冲区,处理'\n'
int aqiu = getchar();
if ('Y' == aqiu)
printf("ok");
else
printf("wrong");
return 0;
}
我们多加了一个getchar,让它清理多余的\n去了。
结果很不错,但是有盲点。比如,空格。
是的,scanf函数也不读取空格……,所以导致我们的设置清理缓冲区的getchar()拿走空格就走了,于是确认密码的getchar()又拿走了剩下的\n就走了,我们又没办法确认密码了。
再改进一下!
int main()
{
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password); //gets就可以读去空格了,因为他是读取一行
printf("请确认密码,输入Y or N\n");
int ha = 0 ;
while ((ha = getchar()) != '\n')
{
; //空语句,清理缓冲区
}
int aqiu = getchar();
if ('Y' == aqiu)
printf("ok");
else
printf("wrong");
printf("%s", password); //但是空格后的密码不会被读取到了
return 0;
}
我们加了while语句来清空缓冲区,终于可以确认密码了呢!
但是,scanf依旧不会读取空格,我们的密码已经不是我们想要的样子了,呜呜呜!
gets就可以读去空格了,因为他是读取一行,但我们先不验证了,继续往前走!
int main()
{
int aqiu = 0;
while ((aqiu = getchar()) != EOF)
{
if (aqiu < '0' || aqiu>'9') //注意0和9用单引号括起来表示字符,看一下ASCII码表
continue;
putchar(aqiu); //也就是说aqiu > '0' && aqiu<'9'的字符会打印出来
}
return 0;
} //同时输入字母和数字的话只打印数字,我们调试看一下过程
ASCII码对照表-完整ASCII码表-我就查查询
从这个网站里找aqiu > '0' && aqiu<'9'的字符,也就是说图中框起来的字符,就是我们能打印出的字符。
可以看到,其他字符都不会被打印出来。
1.while循环语句中的break是用于永久终止循环的。
2.while循环语句中continue跳过本次循环它之后的语句,来到while语句的表达式部分,判断是否进行下一次循环。
getchar()是指从键盘(也就是标准输入)获取一个字符,返回类型是int类型,正确读取返回的是读取到字符的ASCII码值,读取错误或者读取结束会返回EOF。简单点就是说打印从键盘获取的一个字符。
EOF是文件的结束标志 end of file,代码中敲出EOF 右击选中转到定义,它的意思代表-1。putchar()输出一个字符,这是一个函数,括号内是函数调用参数。
scanf读取信息的时候不会读取\n和空格。
下一篇:从0开始学c语言-12-循环执行语句(2)for语句_阿秋的阿秋不是阿秋的博客-CSDN博客