在我们HelloWorld中我们已经看到过一个简单的C程序,这一节我们就针对其中的输入输出进行介绍。
C中可以常见输出输出函数
这写函数用于输入输出,有了输入输出才是程序交互的开始。
函数名 功能printf
格式化输出数据到屏幕scanf
从键盘格式化输入数据putchar
输出一个字符到屏幕getchar
从键盘获取一个字符_getch
无回显的从键盘获取一个字符puts
输出一行字符串到屏幕上gets
从键盘中获取一行字符串
我们如何掌握一个函数
- 函数的功能是什么?
- 函数的这个功能需要什么参数?
函数完成之后,怎么得到结果?
- 屏幕上输出出来的
- 输出到一个变量中了
- 通过返回值
输出到一个变量中
int main()
{
char cCh = 0;
scnaf_s("%c",&cCh,1);
printf("%c",cCh);
return 0;
}
通过返回值
int main()
{
char cCh = 0;
cCh = getchar();
printf("%c", cCh);
return 0;
}
printf函数
函数说明
这个函数的作用,就是在屏幕上打印可以显示的字符串。例如:
void main()
{
printf("我一口气吃了20个包子,太香了!!");
}
上面程序的作用就是在屏幕上打印"我一口气吃了20个包子,太香了!!"
如果们需要手动修改这个20的值,我们就需要用到格式控制符,这里由于20是数字,所以我们需要用"%d"。
void main()
{
printf("我一口气吃了%d个包子,真香!!",2);
}
这样我们输出的结果就是: 我一口气吃了2个包子,真香!!
printf格式化字符串的一般用法如下printf("格式化字符串",参数列表);
格式化字符串这个名词开起来比较难懂,实际上就是一个字符串,然后printf会把字符串原封不动的打印到屏幕上,除非遇到格式控制符。
也就是格式化字符串可能会包含格式控制字符。后面的参数列表可以传递各种各样的数据,称为参数。参数和字符串中的格式控制符是一一匹配的。
参数列表中的参数,可以有任意多个,可以是常量,也可以是变量,但是需要和格式字符串中的控制字符匹配上。这样我们可以了解printf
的作用:
把格式化字符串原样的输出,除非遇到格式控制符,遇到格式控制符的时候,会去参数列表中匹配,把匹配到的参数替换到相应的格式控制符的位置然后输出。
格式控制符
格式控制符都是以%开头的,输出对不同类型的数据要使用不同的格式控制符,对应关系如下所示:
控制符 | 说明 |
---|---|
%d | 整型数据 |
%c | 字符型数据 |
%s | 字符串 |
%lf | double类型数据 |
%f | float类型数据 |
%u | 无符号整数 |
%% | 一个% |
%x | 十六进制整数 |
%o | 八进制整数 |
%p | 地址格式 |
使用实例如下:
int main()
{
int nNumb = 10;
nNumb = nNumb*2;
printf("%d\n",nNumb); //正常输出20
char cCha = 'A';
printf("%c\n",cCha); //会打印字符A
doube fNumb = 127.365;
printf("%lf\n",fNumb); //会打印出浮点数127.365000
}
转义字符
还有一些字符并不是能够用字符表示的,比如我们常用的换行符,制表符,就使用了反斜杠+符号的方式表示它们。以下是常见的转义字符:
转义字符 | 含义 | ASCII码(16/10进制) |
---|---|---|
0 | 空字符(NULL) | 00H/0 |
n | 换行符(LF) | 0AH/0 |
r | 回车符(CR) | 0DH/13 |
t | 水平制表符(HT) | 09H/9 |
v | 垂直制表符(VT) | 0Bh/11 |
a | 响铃(BEL) | 07H/7 |
b | 退格符(BS) | 08H/8 |
f | 换页符(FF) | 0CH/12 |
' | 单引号 | 27H/39 |
" | 双引号 | 22H/34 |
\ | 反斜杠 | 5CH/92 |
scnaf函数和scnaf_s函数
程序与用户的交互是一个基本功能,也得需要用户输入信息,那么如何才能让程序的使用者从键盘给程序传递信息呢?就可以使用scanf或则和scanf_s函数。
基本用法
用法如下:scanf("格式化字符串",参数列表)
scanf的格式化和printf的用法很类似,只不过将scanf
是中的格式控制字符使用控制接受用户输入的数据,参数列表是接受到用户输入数据的变量,这里一一对应的关系。注意在vs中默认只能使用安全版的scanf函数scanf_s
,scanf
是禁用的,他们的用法类似:
//从键盘上获取一个数字,然后以他的2倍进行输出。
int main()
{
int nNum = 0;
scanf_s("%d",&nNum); //这里我们使用了安全版的scanf函数。
printf("%d",nNum*2);
return 0;
}
当程序运行到
scanf
的时候,会停在这里等待用户的输入,等用户输入完毕会回车之后,程序才会继续执行,此时从键盘上输出的数据就被存储到变量中了。
需要注意的是,我们使用scanf
的时候,接受的我们输出的参数的变量需要加一个取地址符&
,如果没有加就会报错。
我们的程序时运行在内存中的,内存中存储了程序中运行所需要的代码和数据。内存中的存储以字节为单位,每一个字节都有一个编号,这个编号就是地址。
每一个变量在定义的时候,其实就是要求操作系统分配一块空间给程序,比如:int a;
看似是一个变量,实际上是要系统分配了4
个字节的内存。并且用a这个名字代表这块内存。
scanf函数的参数列表要传递的是变量所代表的内存空间的地址,而取地址符&
就能够取到变量的地址,所以就会出现上述代码的形式。
scanf和scanf_s的区别
在我最开始接触C语言的时候,我当时使用的是scanf函数,scanf_s是后来在vs上的时候才开始用的,那么这scanf_s到底和scanf有什么区别?其实它就是微软退出的安全版的输入函数,在我们以后的学习中还会遇到很多安全版的函数。
安全版的scanf_s函数和scanf函数只有我们接收的数据是字符串的时候才会有所不同,其他和scanf是一致的,我们来举个例子看看他们有什么不同。
int main()
{
//这里我们就看一下scanf的不安全之处
//1.通过数组的方式演示
char szCh[8] = "hello";
scanf("%s",szCh);
//scanf中参数前需要加上&取地址符,但是数组不需要,因为szCh代表的就是
//数组的首地址(数组名就是数组的首地址)
return 0;
}
我们将这个代运行的时候,会出现错误:
error C4996: 'scanf:....'
,会提示说他是一个不安全的函数(在vs中运行)
如果我们需要使用scanf
来运行,我们需要修改一下配置,我们右击工程,属性->配置管理->c/c++ ->常规->SDL检查修改为否即可。
然后我们继续编译这个代码,然后我们输入超过数组个数的字符串,例如:abcdabcabacd,这样就超出了数组的大小,会造成溢出。
如果我们使用scanf_s会怎么样:
int main()
{
//使用scanf_s没有超出范围的情况
char szCh[8] = "hello";
scanf_s("%s",szCh,8);
//这个最后的8就是限定数组字符的长度,输入的字符串需要比这个数字小
//如果超过了就只能保存一个'\0'。
reutrn 0;
}
scanf_s
在输入字符的时候也需要加一个长度:
int main()
{
char szCh[8] = "hello";
int a,b;
scanf_s("%d%c%d",&a,&szCh[1],1,&b);//输入字符的后面还需要一个参数1,字符长度为1
}
字符串获取函数getchar函数与字符输出函数putchar
getchar函数
getchar()
获取第一个字符,这个函数没有参数
函数功能:从键盘获取一个字符。
返回值:返回输入字符的ascii
码,可以使用字符变量或者整型变量接受。
说明:在屏幕上输入一串字符串,直到遇到回车才结束输入,但函数只接受第一个字符。因为其返回也为int
型,所以定义一个int
型变量接受第一个字符对应的ascii
码。当然也可以定义char
型变量,保存到第一个字符。
int main()
{
int n = getchar();
char ch = getchar();
return 0;
}
putchar()函数
函数原型:int putchar(int c);
函数功能:从终端输出一个字符,且转换成ASCII码返回。
函数参数:其中c要输出的字符,可以是字符型常量、字符型变量、整型常量、整型变量表达式、转义序列等。
int main()
{
int c = 'A';
putchar(c); //参数为字符变量
putchar('A'); //参数为字符常量
putchar(65); //参数为数值常量,输出65对应的ascii码
putchar('5'); //参数为字符常量
putchar('\n'); //参数为字符变量
putchar('5'+1); //参数为表达式,输出的是5对应的ascii码,然后加1
return 0;
}
_getch函数
无回显字符输入函数
函数原型:int _getch(void);
函数功能:从终端输出一个字符,且转换成ASCII码返回。
函数参数:无
不需要每次输入完后输入回车表示结束,只要有键按下就会直接返回,并且不会再屏幕上有显示。
这个函数需要包含头文件#include <conio.h>
int main()
{
char ch = _getch();
return 0;
}