输入输出专题
简介:
C语言库提供了三套输入输出函数,C库输入输出必须添加头文件 #include <stdio.h>
printf() 和 scanf()
putchar() 和 getchar()
puts() 和 gets()
man手册:
linux 提供了函数的使用说明手册。
使用方式:
man 数字 函数名/命令
2 --> 系统调用函数
3 --> C语言库函数
putchar / getchar
putchar 函数
man手册 : man 3 putchar
头文件:#include <stdio.h>
函数原型:
int putchar(int c);
| | | |----> 形式参数名称
| | |----- -->形式参数类型
| |------- ------>函数名称
|--------------------->函数返回值
函数功能:
向终端输出一个字符;
函数参数:
c 需要向终端中输出的字符;
返回值:
成功:输出字符
失败:EOF (-1)
#include <stdio.h>
int main(int argc, const char *argv[])
{
//putchar()直接输出字符
putchar('a');
putchar(10);
//putchar()函数参数使用数字
putchar(65);
//65是数字,putchar输出字符会通过ascii码转换为A
putchar(10);//ascii码 10 对应字符/n换行
//putchar():函数参数变量
int number = 101;//101的ascii -> 'e'
putchar(number);
putchar(10);
//putchar() :函数输出表达式
putchar(number - 32);
putchar(10);
return 0;
}
结果:
a
A
e
E
getchar函数
man手册:man 3 getchar
头文件:#include <stdio.h>
函数原型:
int getchar(void);
函数功能:
从终端中获取一个字符
函数参数:
无参数
返回值:
成功:返回值就是获取的字符
失败:EOF
int main(int argc, const char *argv[])
{
//通过getchar获取一个字符
//定义一个变量保存从终端获取的字符
char ch;
ch = getchar();
getchar();
printf("ch = [%c] [%d]\n",ch,ch);
//getchar();获取多个字符
//会把 换行\n,空格space 也识别为字符
//但这种字符没有用,将之称为垃圾字符
//使用getchar()吃掉垃圾字符
char ch1 = getchar();
getchar();
char ch2 = getchar();
getchar();
printf("ch1 = [%c],[%d]\n",ch1,ch1);
printf("ch2 = [%c],[%d]\n",ch2,ch2);
return 0;
}
puts / gets
puts函数
man手册:man 3 puts
头文件:#include <stdio.h>
函数原型:
int puts(const char *s); //put 输出 s -> string
功能:
向终端中,输出一个字符串,puts自带换行符,会自动换行。
参数:
s:类型:char * -->指针类型
需要输出的字符串。
#include <stdio.h>
int main(int argc, const char *argv[])
{
//puts向终端中输出一个字符串
puts("www.baidu.com");//双引号之间的内容是字符串
//字符串的表达方式:使用数组表示
char str[32] = "hello world";
puts(str);//puts输出一个变量
//字符串也可以使用指针表示
char *mystr = "beijing";
puts(mystr);//输出指针保存的字符串
//注意:C语言中,puts输出的时候遇到\0就结束
puts("aabbcc\0ddeeff");
puts("aacc0ssfff");
return 0;
}
gets函数
man 手册:man 3 gets
头文件:#include <stdio.h>
函数原型:
char *gets(char *s);
函数功能:
从终端中获取一个字符。
函数参数:
s:存储字符串的数组
注意:
gets不会检查存放字符串的大小,如果存放字符串的空间不够,会出现越界问题,很严重!
练习代码:
#include <stdio.h>
int main(int argc, const char *argv[])
{
//定义一个字符串,存放从中端中获取得值
char mystr[20];//定义一个字符串mystr,里面存20个字符
gets(mystr);
printf("mystr = %s\n",mystr);
//error定义一个指针将终端获取的字符串存储到指针?
char* p;//error指针在内存中占8字节,不是用来存放字符串的
gets(p);//error
printf("p = %s\n",p);//error
return 0;
}
printf / scanf
printf函数
man手册:
man 3 printf
头文件:
#include <stdio.h>
函数原型:
int printf(const char *format,...);
功能:
向终端输出一个字符串(自己格式化之后的字符串)
函数参数:
format:格式控制串
格式说明:
%c 字符 eg: printf("this is %c", 'h');
%d 有符号十进制数字 eg: printf("number = %d", number);
%u 无符号十进制数字 eg: printf("%u", number);
%o 八进制数字 eg: printf("八进制数字: %o", number);
%x 十六进制数字 eg: printf("十六进制数字: %x", number);
%s 字符串 eg: printf("字符串: %s", mystr);
printf("age: %d, name:%s",age, name);
%f 浮点类型数据 eg: printf("float : %f", 3.14);
%e 指数形式浮点数据 eg: printf("科学计数法: %e", 3.15e+10);
%p 地址 eg: printf("&number = %p", &number);
附加格式说明:
l 小写的L, 输出long 和long long 以及double类型的时候使用.
eg: %ld --> 输出long类型的数据.
# 配合输出八进制, 十六进制数据的时候,添加上前缀.
eg: %#x :输出的十六进制的数字是有前缀的 0x
%#o :输出的八进制的数字是有前缀的 0
.nf %f输出的时候默认是6位小数, .nf可以限制小数的位数.
eg: %.2f :保留两位小数.
m m是一个数字. 正常的数字都是有位数.
eg: %3d :输出的空间占3个位置,如果位置不够,补充2个不显示的位置.
- 左对齐: 输出数据的时候进行左对齐.
eg: %-2d: 输出数字占2位并且左对齐.
返回值:
输出的字符串
#include <stdio.h>
int main(int argc, const char *argv[])
{
//输出字符
char ch = 'A';
printf("ch = %c\n",ch);
//输出数字
int value1 = 520;
printf("value1 = %d\n",value1);
unsigned int value2 = 1314;
printf("value2 = %u\n",value2);//无符号数
int value3 = 10;//10是十进制数字
printf("八进制value3 = [%o] [%#o]\n",value3,value3);
printf("十六进制value3 = [%x] [%#x]\n",value3,value3);
//输出字符串
char *mystr = "hello world";
printf("mystr = %s\n",mystr);
//输出浮点类型数据
float value4 = 3.14f;
printf("value4 = %f,保留两位小数%.2f\n",value4,value4);
float value5 = 10000000.0f;
printf("科学计数法 value5 = %e\n",value5);
//输出地址
printf("&value5 = %p\n",&value5);
int a = 1,b = 2, c = 3;
printf("%d%d%d\n",a,b,c);
printf("%2d%2d%2d\n",a,b,c);//默认右对齐
printf("%-2d%-2d%-2d\n",a,b,c);
return 0;
}
scanf函数
man 手册: man 3 scanf
头文件: #include <stdio.h>
函数原型:
int scanf(const char *format,......);
功能:
从键盘中输入数据到程序中。
函数参数:
format:scanf函数中format与printf当中是一样的。
以下是最常用的:
格式说明: *****:
%c 字符 eg: scanf("%c", &ch); // scanf输入存放的数据在变量的地址当中
%d 有符号十进制数字 eg: scanf("%d%d",&v1, &v2);
%s 字符串 eg: scanf("%s", str); // 字符串的名称
// 输入的是没有空格的字符串
%f 浮点类型数据 eg: scanf("%f", &f);
%[^\n]s 字符串:带空格的字符串 eg: scanf("%[^\n]s")
注意:
scanf 认为\n 和space 都代表对应的一个格式输入结束。
eg:
scanf("%d%d",&v1,&v2);
从键盘中输入:123 456 \ 123\n456
输入一个字符串给数组s[6],hello,第一个字母对应数组第一个元素,h->s[0] e->s[1] l->s[2] ......
#include <stdio.h>
int main(int argc, const char *argv[])
{
char ch[7];
scanf("%s",ch);
printf("%c\n",ch[3]);
printf("%s\n",ch);
return 0;
}
#include <stdio.h>
int main(int argc, const char *argv[])
{
//从键盘中输入一个字符
//定义一个变量,用来存放输入的字符
char ch = 0;//定义一个char类型的变量,初始化为0
printf("please input char >> ");
scanf("%c",&ch);//从键盘中的字符存放到变量ch中。
//scanf("please input char %c\n",&ch);//不可这样写
//scanf("%c\n",%ch);//格式控制串的前后不可添加\n,space
//出现这俩输入就结束不了了,只能输入任意
//的字符加回车才能结束
//所以scanf的前后不要加任何东西
printf("ch = %c\n",ch);
//从键盘中输入数字
int value1 = 0;
int value2 = 0;
printf("please input two number >> ");
scanf("%d%d",&value1,&value2);//将键盘中输入的数据存放到
//value1,value2当中
printf("value1 = %d , value2 = %d\n",value1,value2);
//输入字符串
//定义字符串 mystr1 mystr2
char mystr1[128];
char mystr2[128];
printf("please input string : >>");
scanf("%s",mystr1);
printf("mystr1 = %s\n",mystr1);
getchar();
printf("please input string : >>");
scanf("%[^\n]s",mystr2);
printf("mystr2 = %s\n",mystr2);
return 0;
}
结果:
please input char >> a
ch = a
please input two number >> 12 23
value1 = 12 , value2 = 23
please input string : >>he
mystr1 = he
please input string : >>hello world
mystr2 = hello world
课堂练习:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char name[128];
char iphone[128];
int age = 0;
char sex = 0;
char school[128];
char add[128];
printf("请输入你的名字:");
scanf("%s",name);
getchar();
printf("请输入你的电话:");
scanf("%s",iphone);
getchar();
printf("请输入你的年龄:");
scanf("%d",&age);
getchar();
printf("请输入你的性别:");
sex = getchar();
getchar();
printf("请输入你的学校:");
scanf("%s",school);
getchar();
printf("请输入你的地址:");
scanf("%s",add);
printf("*********************************\n");
printf(" 姓名:%s \n",name);
printf(" iphone:%s\n",iphone);
printf(" age: %d\n",age);
printf(" 性别:%c\n",sex);
printf(" 学校:%s\n",school);
printf(" 地址:%s\n",add);
printf("*********************************\n");
return 0;
}
吃掉垃圾字符
输入数据的时候:
字符与字符之间:
scanf("%c", &ch);
scanf("%c", &ch1);
如果: 输入内容 a 空格/回车 b 吃掉垃圾字符
如果: 输入内容 ab; 不需要吃掉垃圾字符
字符与字符串之间:
scanf("%c", &ch);
scanf("%s", mystr);
如果: 输入内容 a 空格/回车 hello 吃掉垃圾字符
如果: 输入内容 ahelloworld; 不需要吃掉垃圾字符
具体是否要吃掉垃圾字符,需要具体情况,具体分析, 和你输入的内容相关.
分支控制语句
简介:
C语言程序结构有三种:
顺序结构:从上到下,从左到右,依次执行。
分支结构(选择结构):
判断语句: if switch
循环结构:while do ...while for
分支结构 if ... else 结构
简介:
if ... else 又称为判断语句,判断条件是否成立,根据不同的结果执行不同的代码。
判断语句格式:
单分支结构:
if(condition)
{
code;
}
含义:
判断条件是否成立,(true/false),如果条件成立,则执行code代码。
场景模拟:
从键盘中输入你的年龄. 判断年龄是否 > 18岁, 如果 > 18岁, 输出: 哥, 网吧您随便进,开心就好.
#include <stdio.h>
int main(int argc, const char *argv[])
{
//从键盘输入年龄,判断是否>18
//定义一个变量,保存年龄
int age = 0;
printf("please input your age: >>");
scanf("%d",&age);
//判断
if(age > 18)
{
printf("哥,网吧您随便进,开心就好^ V ^\n");
}
else
{
printf("不满十八不让进V ^ V\n");
}
return 0;
}
情景模拟:
从键盘中输入一个年份, 输出这个年份是否是润年? 闰年: 能被4整除,但是不能被100整除 或者 被400整除.
#include <stdio.h>
int main(int argc, const char *argv[])
{
//能被4整除,不能被100整除或者400整除
int year = 0;
printf("please input year: -> ");
scanf("%d",&year);
if(((year%4==0) && (year%100!=0)) || (year%400== 0))
{
printf("%d是闰年\n",year);
}
else
{
printf("%d是不是闰年\n",year);
}
return 0;
}