字符串的输入和输出函数函数名功能备注puts向终端输出一个字符串int puts(const char *s)参数传入变量常量都行在字符串的最后会加入\ngets从终端接收一个字符串char *gets(char *s)参数传入变量(数组)在输入内容的时候不要越界。越界后行为是不确定putsint main(){puts(hello ,ni hao ); //会加入换行符char str[256]nihao, zhangsan;puts(str);scanf(%s,str);printf(nihao,%s\n,str);return 0;}getsint main(){char name[5]{0};printf(input person name);// 输入的内容大于 4字符以上就会出现越界gets(name); //阻塞等待接收数据printf(%s, hello\n,name);return 0;}linuxubuntu:~/20260422/02stdio$ ./a.outinput person name张三张三, hello就会出现越界后的现象 。*** stack smashing detected ***: unknown terminatedAborted (core dumped)第三章 流程控制顺序逻辑 代码从main函数开始一条挨着一条执行直到最后。分支逻辑 代码从main函数开始有选择性的执行直到最后。循环逻辑 代码从main函数开始对某一段代码执行多次后直到最后顺序、分支、循环流程图顺序逻辑的流程图分支流程图关系(比较)运算符比较运算符操作的对象 数值型 (int float double )比较运算符功能备注大于 双目大于等于 双目小于 双目小于等于 双目等于左右两边等值 双目注意和 (赋值) 的区别!不等于 左右两边不等值 双目使用关系运算符连接的式子: 关系表达式关系表达式 值:逻辑结果 1(真) 0 (假)关系表达式的类型int由于int类型的值域非常大除了 0,1 之外还有很多数。所以有句话非0 即为真#include stdio.hint main(){#if 0// 比较运算符3 5; // 关系表达式 比较类型 int 值 0// 这个地方是 比较操作 在比较运算符的左值和右值都可以是 // 常量变量比表达式 .只会读 左右值 不会写入。35;3 5; // 值 0 假int num 20;num 10 ; // int 110 num ; // int 0num 20 10;num ! 15; // int 1printf(35 is %d\n,35 );printf(35 is %lu\n,sizeof(35) );return 0;}逻辑运算符操作对象 逻辑值 ( 0 1)运算符功能备注逻辑与 双目||逻辑或 双目逻辑非 单目逻辑表达式 值的类型 int 逻辑结果 1(真) 0 (假)逻辑与 左值和右值 同时都为真的情况下 整个表达式的值为真 。 全部都要为真逻辑或 左值和右值 只有有一个值为真 整个表达式的值为真 。 只要一个为真逻辑非 单目 右结合 如果原来是真则变假如果原来是假则变真截断效应短路效应 和|| 运算符有关num b0 b ;对于 操作如果左操作数为0 的情况下右操作数是不会执行的。在这个表达式中虽然 是单目运算符。 但是 截断效应 比运算符的优先级更高。printf(express is %d\n,num b) ;// 表达式的值 0 b ?没变化printf(b is %d\n,b);express is 0b is 1num || b对于 ||操作如果左操作数为1 的情况下右操作数是不会执行的。在这个表达式中虽然 是单目运算符。 但是 截断效应 比运算符的优先级更高。printf(express num || b is %d\n,num || b) ;// 表达式的值1 b ?没变化printf(b is %d\n,b);express num || b is 1b is 1int num 5;0num 10; // 1 10 1num 0 num 10 ; // 0num 10; 0- 10num 0 || num 10; // 1 int!num ; // !5 , 0 intint b 1;num 0 ;printf(express num b is %d\n,num b) ; // 表达式的值 0 b1 ?printf(b is %d\n,b);num 5;num || b; // 5 || b; express 1,printf(express num || b is %d\n,num || b) ; // 表达式的值1 b 1?printf(b is %d\n,b);三目运算符结合方向从右向左? :形式 表达式1 表达式2: 表达式3表达式1 类型 int 结果应该是一个逻辑结果 。如果 表达式1 的值 为 真 则执行表达式2如果 表达式1 的值 为 假 则执行表达式3#include stdio.hint main(){#if 0int num1 0 ;int num2 0;int max 0 ;printf(找两数的最大数 );scanf(%d%d,num1,num2);max num1 num2 ? num1:num2;printf(max is %d\n,max);#endifint num1 0;int num2 0 ;int num3 0 ;int max 0;printf(找3 数的最大数 );scanf(%d%d%d,num1,num2,num3);max num1 num2 ? num1:num2;max max num3 ? max:num3;printf(max is %d\n,max);return 0;}分支结构对代码进行选择行的执行。1 . if else1如果需要实现判断逻辑就需要使用 if2if 后面要紧跟 表达式使用圆括号括起来。3 if 可以单独使用 。else 需要和if配对使用不能单独出现。4 ifelse 后需要被执行的语句建议都使用大括号括起来。即使是一句话5 ifelse 后不要加分号if (表达式){代码块语句块}1 现对表达式 进行求值。 如果表达式值 为真则执行if后紧挨着的语句使用大括号引起来即使是一句话。2, if (表达式) 在这句话后面不要加分号。 如果加了的话语法不会报错。 只有分号的话是一个空语句可能会导致逻辑不对。int num 5;int num210;if(num num2){printf(num 1 num2 相等\n);}int num1 0;int num2 0 ;printf(input 2 num:);scanf(%d%d,num1,num2);int max num2 ;if(num1num2){max num1;}printf(max is %d\n,max);二分支流程if(表达式){语句块1。。。。。。。。。}else{语句块2。。。。。。。。。}对表达式 对表达式求值。 如果为真 就执行语句块1 部分。 如果为假 就执行 语句块2//else 不能单独出现需要和if配对使用。会和最近的if配对int num1 0;int num2 0 ;int max 0 ;printf(input 2 num:);scanf(%d%d,num1,num2);//二分支流程if(num1 num2){max num1;}else // ,{max num2;}printf(max is %d\n,max);两数交换temp b;b a;a temp;#include stdio.hint main(){int a 10;int b20;printf(before a %d ,b %d\n,a,b);int temp 0;temp b;b a;a temp;printf(atfter a %d ,b %d\n,a,b);return 0;}2.阶梯分支if (表达式 1){语句块1}else if( 表达式 2){语句块2}else if( 表达式 3){语句块3}....else{语句块n}#include stdio.hint main(){int cost 0;printf(1,幼儿园,100\n);printf(2,小学生,200\n);printf(3,初中生,300\n);printf(4,高中,400\n);int stu 0 ;scanf(%d,stu);if( 1 stu ) // 等值比较 常量放左边{cost 100;}else if (2 stu){cost 200;}else if(3 stu){cost 300;}else{cost 400;}printf( stu : %d cost :%d\n,stu,cost);}3. if 嵌套形式不建议嵌套层数太多 3-5 层。 多了就不要阅读。if(表达式1){if(表达式2){if(表达式3) if(表达式1 表达式2 表达式3 ){语句1}}}#include stdio.hint main(){int num 0 ;printf(input num :);scanf(%d,num);if(num 60){if(num 70){if(num80){printf(80\n);}else{printf(70 - 80\n);}}else{printf(60-70\n);}}else{printf( 60\n);}return 0;}