目录
1.C语言常见概念
2.C语言数据类型和变量
3.C语言的分支和循环
注:当vs出现scanf报错时,因为 Visual Studio 编译器(MSVC)把 scanf 标记成了【不安全、有风险】的函数,所以它强制你要么用安全版 scanf_s,要么关掉警告,否则不让你正常编译。
scanf 本身有安全漏洞它读字符串时不检查长度,用户随便输超长内容,就会破坏内存、导致程序崩溃、甚至被黑客攻击。微软觉得这太危险了。
微软自己造了个 “安全替代品” scanf_s这是微软专属函数,不是标准 C 语言。它强制你输入长度,防止溢出。所以 VS 就疯狂提示你:
“用 scanf 不安全!快换成 scanf_s!”
VS 不是报错,是【强制安全拦截】你看到的不是语法错误,是微软编译器的安全警告升级成了阻止编译。别的编译器(GCC、Dev-C++)都不会管你,只有 VS 会逼你改。
在代码最顶部第一行加这一句:#define _CRT_SECURE_NO_WARNINGS
加完之后,scanf 直接正常用,再也不会报错。
1.C语言常见概念
#include<stdio.h>intmain(){printf("Hello World");return0; }//第一个C语言程序#include<stdio.h>intmain(){printf("%c\n",'Q');printf("%c\n",81);//81是Q的ASCII值,输出结果同上return0; }#include<stdio.h>intmain(){inti =0;for(i =32; i <=127; i++) {printf("%c ", i);if(i %16==15)printf("\n"); }//可打印字符展示return0; }2.C语言数据类型和变量
#include<stdio.h>intmain(){inta =10;printf("%zd\n",sizeof(a));//%zd 是专门用来打印 sizeof 返回值 的格式符printf("%zd\n",sizeofa);printf("%zd\n",sizeof(int));printf("%zd\n",sizeof(3+3.5));//3会被自动提升为double类型,double在内存里占 8 字节。return0; }#include<stdio.h>intmain(){printf("%zd\n",sizeof(char));printf("%zd\n",sizeof(bool));printf("%zd\n",sizeof(short));printf("%zd\n",sizeof(int));printf("%zd\n",sizeof(long));printf("%zd\n",sizeof(longlong));printf("%zd\n",sizeof(float));printf("%zd\n",sizeof(double));printf("%zd\n",sizeof(longdouble));return0;// 数据类型⻓度}#include<stdio.h>intn =10;intmain(){intn =100;printf("%d", n);//其实当局部变量和全局变量同名的时候,局部变量优先使⽤。return0; }inta = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分printf("There are %d apples\n",3);//整数占位符printf("%s will come tonight\n","zhangsan");//字符串占位符printf("%5d\n",123);//输出为" 123"printf("%-5d\n",123);//输出为"123 "printf("%6.2f\n",0.5);//表⽰输出字符串最⼩宽度为6,⼩数位数为2printf("%.5s\n","hello world");//表⽰只输出字符串“helloworld”的前5个字符3.C语言的分支和循环
#include<stdio.h>intmain(){intage =0;scanf("%d", &age);if(age >=18)printf("成年\n");elseprintf("未成年\n");return0; }#include<stdio.h>intmain(){intage =0;scanf("%d", &age);if(age >=18)//if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句{printf("成年了\n");printf("可以谈恋爱了\n"); }else//else 后使⽤{}控制多条语句-这个块也叫:程序块,或者复合语句{printf("未成年\n");printf("不可以早恋哦\n"); }return0; }#include<stdio.h>intmain(){inta =0;intb =2;if(a ==1)if(b ==2)printf("hehe\n");elseprintf("haha\n");//else 总是跟最接近的 if 匹配。return0; }#include<stdio.h>intmain(){intage =0;scanf("%d", &age);if(18<= age <=36) {printf("⻘年\n");//18<=age的结果是0,再拿0和36⽐较,0 <= 36为真,所以打印了⻘年}return0; }#include<stdio.h>intmain(){inta =0;intb =0;scanf("%d %d", &a, &b);intm = a > b ? a : b;printf("%d\n", m);return0; }#include<stdio.h>intmain(){intday =0;scanf("%d", &day);switch(day) {case1:case2:case3:case4:case5:printf("⼯作⽇\n");break;case6:case7:printf("休息⽇\n");break;default:printf("输⼊错误\n");break; }return0; }#include<stdio.h>intmain(){intn =0;scanf("%d", &n);while(n) {printf("%d ", n %10); n /=10; }//输⼊⼀个正的整数,逆序打印这个整数的每⼀位return0; }#include<stdio.h>intmain(){inti =0;intsum =0;for(i =3; i <=100; i +=3) { sum += i; }//计算1~100之间3的倍数的数字之和printf("%d\n", sum);return0; }#include<stdio.h>intmain(){intn =0;scanf("%d", &n);intcnt =0;do{ cnt++; n = n /10; }while(n);//输⼊⼀个正整数,计算这个整数是⼏位数?printf("%d\n", cnt);return0; }#include<stdio.h>intmain(){inti =1;while(i <=10) {if(i ==5)break;//当i等于5后,就执⾏break,循环就终⽌了printf("%d ", i); i = i +1; }return0; }#include<stdio.h>intmain(){inti =1;while(i <=10) {if(i ==5)continue;//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环printf("%d ", i); i = i +1; }return0; }#include<stdio.h>intmain(){inti =1;for(i =1; i <=10; i++) {if(i ==5)break;printf("%d ", i); }return0; }#include<stdio.h>intmain(){inti =1;for(i =1; i <=10; i++) {if(i ==5)continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分printf("%d ", i); }return0; }#include<stdio.h>intp(intx){for(inti =2; i * i <= x; i++) {if(x % i ==0)return0; }return1; }intmain(){intn;scanf("%d", &n);if(p(n) ==1)printf("素数");elseprintf("不是素数");return0; }#include<stdio.h>intmain(){printf("hehe\n");gotonext;printf("haha\n"); next:printf("跳过了haha的打印\n");return0; }4.C语言数组
intmath[20];charch[8];doublescore[10];//一维数组创建intarr[3][5];doubledata[2][8];//二维数组创建//完全初始化intarr[5] = {1,2,3,4,5};intarr3[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};//不完全初始化intarr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0intarr1[3][5] = {1,2};intarr2[3][5] = {0};//错误的初始化 - 初始化项太多intarr3[3] = {1,2,3,4};#include<stdio.h>intmain(){intarr[10] = {1,2,3,4,5,6,7,8,9,10};inti =0;for(i =0; i <10; i++) {scanf("%d", &arr[i]); }//输入数组for(i =0; i <10; i++) {printf("%d ", arr[i]); }//打印数组return0; }#include<stdio.h>intmain(){intarr[10] = {1,2,3,4,5,6,7,8,9,10};inti =0;for(i =0; i <10; i++) {printf("&arr[%d] = %p\n ", i, &arr[i]); }//⼀维数组在内存中的存储return0; }#include<stdio.h>intmain(){intarr[10] = {0};printf("%d\n",sizeof(arr));return0;//计算数组的⼤⼩。}#include<stdio.h>intmain(){intarr[10] = {0};intsz =sizeof(arr) /sizeof(arr[0]);//计算出数组的元素个数printf("%d\n", sz);return0; }#include<stdio.h>intmain(){intarr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};inti =0;//遍历⾏//输⼊for(i =0; i <3; i++)//产⽣⾏号{intj =0;for(j =0; j <5; j++)//产⽣列号{scanf("%d", &arr[i][j]);//输⼊数据} }//输出for(i =0; i <3; i++)//产⽣⾏号{intj =0;for(j =0; j <5; j++)//产⽣列号{printf("%d ", arr[i][j]);//输出数据}printf("\n"); }return0; }#include<stdio.h>intmain(){intarr[3][5] = {0};inti =0;intj =0;for(i =0; i <3; i++) {for(j =0; j <5; j++) {printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]); } }//跨⾏位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的return0; }#include<stdio.h>intmain(){intarr[] = {1,2,3,4,5,6,7,8,9,10};intleft =0;intright =sizeof(arr) /sizeof(arr[0]) -1;intkey =7;//要找的数字intmid =0;//记录中间元素的下标intfind =0;while(left <= right)//二分查找{ mid = (left + right) /2;if(arr[mid] > key) { right = mid -1; }elseif(arr[mid] < key) { left = mid +1; }else{ find =1;break; } }if(1== find)printf("找到了,下标是%d\n", mid);elseprintf("找不到\n"); }5.C语言函数
#include<stdio.h>#include<math.h>intmain(){doubled =16.0;doubler =sqrt(d);//库函数计算平方根printf("%lf\n", r);return0; }#include<stdio.h>intAdd(intx,inty)//自定义函数{returnx + y; }intmain(){inta =0;intb =0;//输⼊scanf_s("%d %d", &a, &b);//调⽤加法函数,完成a和b的相加//求和的结果放在r中intr =Add(a, b);//输出printf("%d\n", r);return0; }6.C语言函数递归
#include<stdio.h>intFact(intn){if(n ==0)return1;elsereturnn *Fact(n -1); }intmain(){intn =0;scanf("%d", &n);intret =Fact(n);printf("%d\n", ret);return0; }#include<stdio.h>voidPrint(intn){if(n >9) {Print(n /10); }printf("%d ", n %10); }intmain(){intm =0;scanf("%d", &m);Print(m);return0; }#include<stdio.h>intcount =0;intFib(intn){if(n ==3) count++;//统计第3个斐波那契数被计算的次数if(n <=2)return1;elsereturnFib(n -1) +Fib(n -2); }intmain(){intn =0;scanf("%d", &n);intret =Fib(n);printf("%d\n", ret);printf("\ncount = %d\n", count);return0; }7.C语言操作符
#include<stdio.h>intmain(){intnum =10;intn = num <<1;printf("n= %d\n", n);printf("num= %d\n", num);return0; }#include<stdio.h>intmain(){intnum =10;intn = num >>1;printf("n= %d\n", n);printf("num= %d\n", num);return0; }#include<stdio.h>intmain(){intnum1 =-3;intnum2 =5;printf("%d\n", num1 & num2);printf("%d\n", num1 | num2);printf("%d\n", num1 ^ num2);printf("%d\n", ~0);return0; }//代码1:变量的定义structPoint{intx;inty; }p1;//声明类型的同时定义变量p1structPointp2;//定义结构体变量p2//代码2:初始化。structPointp3 = {10,20};structStu//类型声明{charname[15];//名字intage;//年龄};structStus1 = {"zhangsan",20};//初始化structStus2 = { .age =20, .name ="lisi"};//指定顺序初始化//代码3structNode{intdata;structPointp;structNode* next; }n1 = {10, {4,5},NULL};//结构体嵌套初始化structNoden2 = {20, {5,6},NULL};//结构体嵌套初始化#include<stdio.h>#include<string.h>structStu{charname[15];//名字intage;//年龄};voidprint_stu(structStu s){printf("%s %d\n", s.name, s.age); }voidset_stu(structStu* ps){strcpy(ps->name,"李四"); ps->age =28; }intmain(){structStus = {"张三",20};print_stu(s);set_stu(&s);print_stu(s);return0; }