第六天学C语言(分支与循环语句)putchar,getchar,输入缓冲区,while和for循环

                (2020.9.8)

分支语句:有if语句和switch,case语句,default子句(参考9.6)

(if语句不会重复被执行)

(switch允许使用嵌套使用,在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支

循环语句:while语句,for语句,do while语句

while(表达式)

(如果表达式括号里面为1,则一直执行,进入死循环)

循环语句;

int i = 1;

while (i<=10)

{ printf("%d\n", i);

扫描二维码关注公众号,回复: 11635029 查看本文章

i++;

}(因为有两句话要用大括号)

(记住一个=为赋值,两个==才为判断是否相等)

循环里面break的作用:停止循环,跳出循环

循环里面continue的作用用于终止本次循环的,当遇到continue的时候后面的代码也不再执行,直接认为这次循环结束了,跳过本次循环,再来看下一次循环要不要继续

getchar:获取键盘输入的一个字符,接收字符

=!:意思不等于,=是赋值运算符,!是逻辑非运算符

putchar函数的作用:向终端输出一个字符

代码:

int ch = 0;

while ((ch = getchar()) != EOF)

putchar(ch);

在屏幕上输出ctrl+z代码才会结束,此时getchar才会获取一个EOF,此时while括号里面为假,所以才跳出循环,直接输出EOF不会结束,因为其相当于打印了三个字母

EOF:end of file--文件结束标志--本质上的值为-1

default:

printf("输入错误\n");default:用来提示用户输入错误)(写在任何一个case标签可以出现的位置,当switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行)

break:永久终止循环

代码:

int ch = 0;

while ((ch = getchar()) != EOF)(getchar是接收一个字符,放到ch里面去,拿起这个字符然后判断此字符是否等于EOF,若不等于EOF则把CH打印出来)

putchar(ch);

此代码有什么实际价值呢:

char password[20] = { 0 };(char:字符数据类型:abcd,[10]:表示放10个元素,=:表示要给它赋值,{}:{里面是一个集合})%s:打印字符串时用

printf("请输入密码:");

scanf_s("%s", password);(表示输入密码并且存放在password数组中)

-------------------------------------分割线--------------------------------------

代码1:int ret = 0;

char password[20] = { 0 };

printf("请输入密码:");

scanf_s("%s", password,sizeof(password));

(如果没有加上sizeof(password)的话会报出警告:scanf_s”: 没有为格式字符串传递足够的参数,原因在使用%c和%s读入字符或字符串时,应在地址参数后附加一个缓冲区边界值The buffer size includes the terminating null. You can use a width specification field to ensure that the token that's read in will fit into the buffer. If no width specification field is used, and the token read in is too big to fit in the buffer, nothing is written to that buffer.)

printf("请确认(Y/N)");

ret = getchar();

if (ret == 'y')一般字符'A'代表字符A,ascii码值是97)

{

printf("q确认成功\n");

}

else

{

printf("放弃确认\n");

}

getchar和passward是输入函数,工作原理:输入缓冲区,刚开始没有东西,输入密码123456\n之后,但scanf在读的时候仅仅读取了123456,\n只是我们敲的回车让其去读取密码,接下来getchar要读取字符,由于输入缓冲区里面有\n所以它就直接读走了,\n=10不等于y,所以就输出放弃确认,这样输出错误,不会等我们来确认y或n,因为当我们输出密码时有按回车键,

如何解决错误:

int ret = 0;

char password[20] = { 0 };

printf("请输入密码:");

scanf_s("%s", password,sizeof(password));

printf("请确认(Y/N)");

        getchar();(在读取一次,让输入缓冲区清零)

ret = getchar();

if (ret == 'y')

{

printf("q确认成功\n");

}

else

{

printf("放弃确认\n");

}

如果输入的密码为123456 ABCD会又一次报错,原因是scanf只是读取空格前面的内容,然后第一个getchar读入了空格,第二个getchar读取了A

解决方法:利用循环,读取全部字符,一直读取到\n

int ch = 0;

int ret = 0;

char password[20] = { 0 };

printf("请输入密码:");

scanf_s("%s", password,sizeof(password));

printf("请确认(Y/N)");

while((ch=getchar())!='\n')(若getchar读取的东西赋值到ch中不等于\n,但要注意\n必须加单引号,因为是一个字符)

{

    ;(这里面不用写东西,这个分号代表空语句,不需要在循环里面做事情,只要在循环的部分不断的读,判断,读,判断...)

}

ret = getchar();

if (ret == 'y')

{

printf("q确认成功\n");

}

else

{

printf("放弃确认\n");

}

||:代表的是逻辑或

写while循环时必须先有一个变量

int i=0;(循环变量初始化)

while(i<10)(循环变量判断)

{

i++;(循环变量调整)

}

------------------------------------------------------------------------------------------------------

for循环:将循环变量的初始化,判断,调整集中在一起,使代码容易修改

语法:

for(表达式1;表达式2;表达式3)

循环语句

(表达式1;初始化部分--创建i,表达式2;条件判断部分--完成i<10这个判断,表达式3;用于循环条件的调整--i++)

用while循环和for循环分别打印1~10的数字:

1.

int a = 1;

while (a <= 10)

{

printf("%d\n", a);(如果加入了continue会进入死循环)

             a++;

}

2.

int a = 0;

for (a = 1; a <= 10; a++)(i=1只要执行一次)

{

printf("%d\n", a);

}

for循环是多种循环中用的最多的循环

!=:意思是不等于!!!!!!!!!!!!

在while循环和for循环里面break是同一个意思,都是终止,跳出循环

---------------------------------------------------------------------分割线--------------------------

int a = 0;

for (a = 1; a <= 10; a++)

{

if (a == 5)

continue;

printf("%d\n", a);

}

for循环加了一个continue之后:打印出来的没有5,只是打印了1 2 3 4 6 7 8 9 10,而如果是while循环加了一个continue之后:只是打印1 2 3 4,然后进入死循环。因为for循环进入continue之后跳过进入a++,有机会跳出死循环,continue是跳过其后面的代码)

------------------------分割线---------------------------------

int a = 0;

for (a = 1; a <= 10; a++)

{

if (a == 5)

break;

printf("%d\n", a);

}

(此时只是打印了1234)

------------------------分割线---------------------------------

对于for循环的一些建议:

1.不可在for循环体内修改循环变量,防止for循环失去控制:

例如:

int i = 0;

for (i = 0; i <= 10; i++)

{

if (i = 5)(让i赋值为5是错误操作,会进入死循环)

printf("haha\n");

printf("hehe\n");

}

2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法

例如:

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };(数组)

int i = 0;

for (i = 0; i < 10; i++)(这就叫左边闭右边开,10代表了某种意义:10次循环,10此打印,10个元素)

{

printf("%d\n", arr[i]);(打印数组的每个元素)

}


猜你喜欢

转载自blog.51cto.com/14921228/2530591
今日推荐