#include<stdio.h>
int main()
{
//EOF -end of file 文件结束标志
int ch = 0;
while((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
scanf和getchar都是输入函数
工作原理:在读字符串时先去检测输入缓冲区,如果输入缓冲区里没有数据,会闪动光标等待你输入一些数据
如果有东西,会从输入缓冲区拿走想要的一部分
#include<stdio.h>
int main()
{
int ch = 0;
int ret = 0;
char password[20] = {0};
printf("请输入密码:>");
scanf("%s",password); //输入密码,并存放在password数组中
//缓冲区还剩一个‘\n’
//要把‘\n’读取走
while ((ch = getchar()) != '\n')
{
;
}
printf("请确认(Y/N):>");
ret = getchar(); //Y/N
if(ret == "Y")
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
return 0;
}
只输入数字字符
#include<stdio.h>
int main()
{
int ch = 0;
while((ch = getchar()) != EOF)
{
if(ch < '0' || ch > '9')
continue;
putchar(ch);
}
return 0;
}
循环语句常用排序
1.for语句
2.while语句
3.do...while语句
for循环
for循环语法
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量。
表达式2为条件判断部分,用于判断循环体什么时候终止。
表达式3为调整部分,用于循环条件的调整。
while循环和for循环的对比
//while循环
#include <stdio.h>
int main()
{
int i = 0; //初始化
//初始化
//.....
while(i<10) //判断
{
//....
i++; //调整
}
return 0;
}
//for循环
//在屏幕上打印1~10
#include <stdio.h>
int main()
{
int i = 0;
// 初始化 判断 调整
for(i = 1;i<=10;i++)
{
printf("%d",i);
}
return 0;
}
break,continue
for循环中的break和continue,他们的意义和在while循环中是一样的
//break
#include <stdio.h>
int main()
{
int i = 0;
for(i = 1;i <= 10;i++)
{
if(5 == i)
break;
printf("%d ",i); //1 2 3 4
}
return 0;
}
//continue
#include <stdio.h>
int main()
{
int i = 0;
for(i = 1;i <= 10;i++)
{
if(5 == i)
continue;
printf("%d ",i); //1 2 3 4 6 7 8 9 10
}
return 0;
}
while循环中的continue和for循环中的continue对比
//while循环
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(5 == i)
continue;
printf("%d ",i);//1 2 3 4 死循环
i++;
}
return 0;
}
for语句的循环控制变量 一些建议:
1.不可在for循环体内修改循环变量,防止for循环失去控制
2.建议for语句的循环控制变量的取值采用“前闭后开”写法
//1.
#include <stdio.h>
int main()
{
int i = 0;
for(i = 0;i<10;i++)
{
if(i = 5)
printf("haha\n");
printf("hehe\n");
}
return 0;
}
//2.
#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++) 前闭后闭区间
for(i = 0;i<10;i++) //前闭后开区间
{
printf("%d ",arr[i]);
}
return 0;
}
一些for循环的变种
//变种1
#include <stdio.h>
int main()
{
for(;;)
{
printf("hehe\n");
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for(;i<10;i++)
{
for(;j<10;j++)
{
printf("hehe\n"); //打印10个hehe
}
}
return 0;
}
1.for循环的初始化,判断,调整都可以省略,但是:for循环的判断部分如果被省略,那判断条件就是:恒为真
2.如果不是非常熟练,建议大家不要随便省略
//变种2
#include <stdio.h>
int main()
{
int x,y;
for(x = 0, y = 0;x<2 && y<5;x++,y++)
{
printf("hehe\n"); //打印2个hehe
}
return 0;
}
一道笔试题 请问循环要循环多少次
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i = 0,k = 0;k = 0;i++,k++) //=为赋值符号 k=0为假不进入循环
k++;
return 0;
}
do...while循环
语法
do
循环语句;
while(表达式);
在屏幕上打印1~10
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ",i);
i++;
}
while(i<=10);
return 0;
}
break
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(5 ==i)
break;
printf("%d ",i);//打印1,2,3,4
i++;
}
while(i<=10);
return 0;
}
continue
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(5 == i)
continue;
printf("%d ",i); //1 2 3 4 死循环
i++;
}
while(i<=10);
return 0;
}
练习
计算n的阶乘
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf("%d",&n);
for(i = 1;i<=n;i++)
{
ret = ret*i;
}
printf("%d\n",ret);
return 0;
}
计算1!+2!+3!+......+10!(计算1的阶乘+2的阶乘.....)
//法1
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1
int sum = 0;
for(n = 1;n<=10;n++)
{
ret = 1;
for(i = 1;i<=n;i++)
{
ret = ret*i;
}
sum = sum + ret;
}
printf("sum = %d\n",sum);
return 0;
}
//法2
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for(n =1;n<=10;n++)
{
ret = ret * n;
sum = sum + ret;
}
printf("sum = %d\n",sum);
return 0;
}
写一个代码,在arr数组中(有序的)中找到7
//法1
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k =7;
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i = 0;i<sz;i++)
{
if(k == arr[i])
{
printf("找到了,下标是:%d\n",i);
break;
}
}
if (i == sz)
printf("找不到\n");
return 0
}
//法2 折半查找算法 二分查找算法
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;
int sz = sizeof(arr)/sizeof(arr[0]); //计算元素个数
int left = 0;
int right = sz-1;
while(left<=right)
{
int mid = (left+right)/2;
if(arr[mid]>k)
{
right = mid-1;
}
else if(arr[mid]<k)
{
left = mid+1;
}
else
{
printf("找到了,下标是:%d\n",mid);
break;
}
}
if(left>right)
{
printf("找不到\n");
}
return 0;
}
编写代码,演示多个字符从两端移动,向中间汇聚“welcome to bit !!!!!!”
#include <stdio.h>
#incldue <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
char arr1[] = "welcome to bit !!!!!!";
char arr2[] = "#####################";
int left = 0;
//int right = sizeof(arr)/sizeof(arr[0]) - 2;// 字符串末尾有一个'\n'
int right = strlen(arr1) -1;
while(left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n",arr2);
//休息1s
Sleep(1000); //windows.h
system("cls"); //执行系统命令的一个函数 —cls 清空屏幕 stdlib.h
left++;
right--;
}
printf("%s\n",arr2);
return 0;
}
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
void delay(unsigned int ms)
{
unsigned int j, k;
for (j = 0; j < ms; j++)
for (k = 0; k < 125; k++)
;
}
int main()
{
char arr1[] = "welcome to bit!!!!!!";
char arr2[] = "####################";
int left = 0;
//int right = sizeof(arr1) / sizeof(arr1[0]) - 2;
int right = strlen(arr1) - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
//休息1s
delay(20000);
system("cls"); //执行系统命令的一个函数 -cls -清空屏幕 stdlib.h
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
编写代码实现模拟用户登录情景,并且只能登陆三次(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序)
#include <stdio.h>
#include <sting.h>
int main()
{
int i = 0;
char password[20] = {0};
for(i = 0;i<3;i++)
{
printf("请输入密码:>");
scanf("%s",password);
if(strcmp(password,"123456") == 0) //==不能用来比较两个字符串是否相等,应该使用一个库函数-strcmp
{
printf("登陆成功\n");
break;
}
else
{
printf("输入错误\n");
}
}
if(i == 3)
printf("三次密码均错误,退出程序\n");
return 0;
}