二、基础内容
4、输入输出
函数三要素:功能,参数,返回值
4.1、按格式输入输出
4.1.1、按格式输出
printf
man 3 printf
#include <stdio.h>
int printf(const char *format, ...);
功能:按照指定格式向终端输出
#include<stido.h>
int main()
{
//按格式输出,格式匹配
int a = 10;
printf("a=%d\n", a);
float b = 1.1;
printf("b=%d\n",b);
printf("b=%f\n",b);
printf("a=%d b=%f\n",a,b);
return 0;
}
程序运行结果如下:

变量b是单精度浮点型数据,printf一个整型数据,计算机会将变量b按照浮点型数据转化成二进制数据储存,然后以整型数据的输出过程转化成整型输出出来。所以要注意格式匹配,在这种情况下,计算机会给与一个警告,需要注意。
格式:
%d int 整型 %ld long 长整型 %ll long long 长长整型 %hd short 短整型 %c char 字符型 %f float 单精度浮点型 %lf double 双精度浮点型 %s 字符串 %i 十进制 %o 八进制 %x 十六进制 %u unsinged int 无符号十进制整型 %p 地址 %e 指数 注意:%-m.n:
-:输出内容左对齐,默认是右对齐
m:位宽、
.n:保留小数位数
参数:format:字符串:“hello world”
#include<stdio.h>
int main()
{
//formant:字符串
printf("hello world\n");
return 0;
}
format里面实际上是字符串
返回值:由int确定,printf的返回值是输出字符的个数
#include<stdio.h>
int main()
{
//返回值
int ret1 = printf("hello world\n");
int ret2 = printf("hello world");
int ret3 = printf("\nret1=%d\n",ret1);
printf("ret2=%d\n",ret2);
printf("ret 3 = %d\n",ret3);
return 0;
}
程序运行结果如下:
ret2只有11个,比ret1少了个\n,所以printf的返回值不计算\0,但是计算\n。
ret3为9,所以%和d算2个字符。
4.1.2、按格式输入
scanf
man 3 scanf
#include <stdio.h>
int scanf(const char *format, ...);
功能:按格式输入
#include<stdio.h>
int main()
{
//按格式输入
int a, b;
printf("a=%d b=%d\n",a,b); //a=0 b=0
scanf("%d %d",&a,&b);
printf("a=%d b=%d\n",a,b);
//功能性格式不要加
float c;
scanf("%f",&c); //-m.n
printf("c=%f\n",c);
return 0;
}
参数:同printf
返回值:正确输入的数据个数
#inculde<stdio.h>
int main()
{
//返回值
int ret = scanf("%d %d",&a,&b);
printf("ret = %d\n",ret);
return 0;
}
当第一个数据输入格式不正确时,scanf会直接中断,后面的数据不会输入
4.2、按字符输入输出
4.2.1、按字符输入—getchar
man 3 getchar
#include<stdio.h>
int getchar(void);
三要素:
功能:从终端输入一个字符
参数:void,空
返回值:输入字符的ASCII码
使用:
int ascii = getchar();
printf("%c\n", ascii);
4.2.2、按字符输出—putchar
man 3 putchar
#include<stdio.h>
int putchar(int c);
三要素:
功能:向终端输出一个字符
参数:要输出的字符的ASCII码
返回值:要输出的字符的ASCII码
使用:
int ascii = getchar();
putchar(ascii);
用getchar、putchar实现大小写字母转换并排除错误
#include<stdio.h>
int main()
{
int get = getchar();
if ( get>=65 && get<=90 )
{
putchar(get+32);
putchar('\n');
}
else if ( get >= 97 && get <= 122 )
{
putchar(get-32);
putchar('\n');
}
else
{
printf("no\n");
}
return 0;
}
4.2.3、字符回收
#include<stdio.h>
int main()
{
char a, ch;
scanf( "%c%c", &a, &ch);
printf( "a=%c ch=%c\n", a, ch);
return 0;
}
运行结果如下:

可见,输入ab时,a给到a,b给到ch,输出没有问题;但是当按照正常输入逻辑,输入a b时,a照常给到a,但是此时‘ ’给到了ch,输入的b消失了,此时,输入的空格就是垃圾字符,需要想办法回收。
三种方法:空格、%*c、gatchar()
1、空格: scanf( "%c %c", &a, &ch);
#include<stdio.h>
int main()
{
char a, ch;
scanf("%c %c", &a, &ch);
printf("a=%c ch=%c\n", a, ch);
return 0;
}
运行结果如下:

可见,在scanf中的%c之间加上空格之后,这个空格可以回收分隔符,即空格,tab,回车。
优点:可以回收所有的分隔符,不限数量
缺点:只能回收分隔符
2、%*c: scanf( "%c%*c%c", &a, &ch);
#include<stdio.h>
int main()
{
char a, ch;
scanf("%c%*c%c", &a, &ch);
printf("a=%c ch=%c\n", a, ch);
return 0;
}
运行结果如下:

优点:%*c可以回收所有字符
缺点:只能回收一个
3、getchar():
一个死循环,来验证gatchar的作用
#include<stdio.h>
int main()
{
char ch;
int b = 0;
while(1)
{
scanf("%c", &ch);
getchar();
printf("%c", ch);
b++;
printf("%d\n", b);
}
return 0;
}
当没有getchar时:

输入的字符实际上输入的是a和回车,ch只能接受一个字符,回车就进入暂存,输出一个a后,b自加变成1,跟在a后面输出,执行\n后进入第二次循环,ch优先从暂存接受数据所以第二次循环先输出一个回车,b再次自加,变成2,跟在回车后面打印输出2,然后打印\n。
当getchar存在时:

输入的字符还是a和回车,ch接受一个字符后,回车被getchar接受,打印输出时只输出ch的a,紧跟着是b的自加变成1和\n第一次循环结束,暂存里面没有东西不会进入下一次循环
三、语句
1、分支语句
根据不同条件,执行不同的语句
1.1、if
1.1.1、分支
结构如下:

if(表达式)
{
语句块1;
}
else
{
语句块2;
}
表达式1成立,执行语句块1,表达式1不成立,执行语句块2
示例如下:
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
if (a>10)
{
printf("OK\n");
}
else
{
printf("NO\n");
}
return 0;
}
用法:
if后面可以没有else,但是else前面必须有if
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
if (a>10)
{
printf("OK\n");
}
return 0;
}
if的大括号可以删掉,但是只能匹配一条语句
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
if (a>10)
printf("OK\n");
else
printf("NO\n");
return 0;
}
1.1.2、分层
结构如下

if(表达式)
{
语句块1;
}
else if(表达式2)
{
语句块2;
}
else if(表达式3)
{
语句块3;
}
else
{
语句块4;
}
示例如下:
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
if (a>=10 && a<=20)
{
printf("10<%d<20\n",a);
}
else if (a<10)
{
printf("<10\n");
}
else
{
printf(">20\n");
}
return 0;
}
1.1.3、嵌套
结构如下

if(表达式1)
{
if(表达式2)
{
语句块1;
}
else
{
语句块2;
}}
else
{
if(表达式2)
{
语句块3;
}
else
{
语句块4;
}
}
示例如下:
输入三个整数,按照从大到小排列:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int num1, num2, num3;
int max, mid, min;
scanf ( "%d %d %d", & num1, & num2, & num3);
if ( num1 > num2 )
{
if ( num1 > num3)
{
max = num1;
if ( num2 > num3)
{
mid = num2;
min = num3;
}
else
{
mid = num3;
min = num2;
}
}
else
{
max = num3;
mid = num1;
min = num2;
}
}
else //1 < 2
{
if ( num2 > num3) //1 < 2, 2 > 3
{
max = num2;
if ( num1 > num3) //2 > 1 > 3
{
mid = num1;
min = num3;
}
else //2 > 3 >1
{
mid = num3;
min = num1;
}
}
else //1 < 2, 2 < 3
{
max = num3;
mid = num2;
min = num1;
}
}
printf ( "%d > %d > %d\n", max, mid, min);
return 0;
}

3080

被折叠的 条评论
为什么被折叠?



