「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!
前言:有人可能觉得笔者写的东西很简单,没有写的必要!但是我想说的是,存在即合理!夯实基础才是yyds!知识分享yyds!
不喜勿喷,谢谢各位!
如有错误,欢迎斧正!
1.C语言是结构化的程序设计语言
c语言中有3中结构:顺序结构,选择结构,循环结构
空语句: ; //只有一个分号
2.C语言中非0表示真,0表示假
判断:C语言中,1表示真,0表示假
错: 非0表示真
3.else和if的匹配
就近原则:else与最近的if匹配
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
//什么也不打印
//因为if和最近的else匹配,因为不满足 a == 0所以不进入第一个if循环,所以不打印
//相当于 //增加了程序的可读性
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
程序题:打印1-100的奇数并计算个数
//方法1:故意营造奇数出来打印,效率更高
int main()
{
int count = 0;
int i = 1;
//while循环的写法
/*
while(i < 100)
{
printf("%d ",i);
i += 2;
count++;
}
*/
//for循环写法
for(i = 1; i < 100; i+=2)
{
printf("%d ",i);
i += 2;
count++;
}
printf("1-100的奇数个数为:%d\n",count);
}
//写法2:产生1-100的数,奇数:除2余数为1
int main()
{
int count = 0;
int i = 1;
while(i < 100)
{
if(i % 2 == 1)
{
printf("%d ",i);
}
i++;
}
return 0;
}
4.EOF-end of file 文件结束标志
EOF-> 代表的值为-1
getchar() : 读取失败的时候返回EOF
-
返回的字符,本质是字符也是ASCII码值,是整数
-
getchar 函数不仅仅是返回正常字符,还会返回EOF 是-1,所以放到整形变量中
遇到ctrl+z时结束循环输入
循环输入的方法
//写法1
while( (c = getchar()) !=EOF) //用括号括起来
while( scanf("%d",&a) != EOF)
//写法2
while( ~(c = getchar()) )
while( ~(scanf("%d",&a)) )
-1:
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
内存中存放的是补码
EOF为-1
按位取反-1的补码 ->全0序列 即为0
程序题:密码确认题 (缓冲区)
输入缓冲区:内存空间
scanf ,getchar:从键盘上输入东西到输入缓冲区, 从输入缓冲区拿东西
//err程序
int main()
{
int ch = 0;
char password[20] = {0};
printf("请输入密码>:");
scanf("%S",password);//数组名是首元素地址,不用加取地址
printf("请确认密码(Y/N)>:");
ch = getchar();
if(ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
从键盘中输入字符到缓冲区,然后scanf,getchar拿东西,getchar一次只能读取一个字符,%s只能读到空白字符前的字符
空白字符:空格,换行)
因为最后一个是换行符(\n),所以我们要把缓冲区的字符清理干净,当getchar读取到\n使,说明缓冲区已经清理干净了
//正解
int main()
{
int ch = 0;
char password[20] = { 0 };
printf("请输入密码>:");
scanf("%s", password);//数组名是首元素地址,不用加取地址
printf("请确认密码(Y/N)>:");
//清理缓冲区字符
while (getchar() != '\n')
{
; //空语句,不处理
}
ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
若想要读取有空格的作为密码:使用gets()函数
使用gets()则不用考虑缓冲区的问题
int main()
{
int ch = 0;
char password[20] = { 0 };
printf("请输入密码>:");
gets(password);
printf("请确认密码(Y/N)>:");
ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}