在我们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字符串
%lfdouble类型数据
%ffloat类型数据
%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_sscanf是禁用的,他们的用法类似:

 //从键盘上获取一个数字,然后以他的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;
}
最后修改:2020 年 08 月 26 日
如果觉得我的文章对你有用,请随意赞赏