1.putchar函数
我们首先从最简单的putchar函数开始。首先讲的是该函数的作用:将一个字符输出到标准输出流(你可能不知道什么是标准输出流,这里其实不用去理解什么是标准输出流,简单的理解为把一个字符输出到屏幕就行了)。
接下来让我们用例子来描述这个函数
(1)简单的输出一个字符
#include <stdio.h>
int main(void)
{
putchar("1");
printf("\n");
return 0;
}复制代码
这里的printf那行不用管它,它的作用就是换行,分开输出内容和程序运行完毕时编译器自动输出的内容,使输出时看的更简洁明了,如下,没有 printf("\n");的输出结果:
这里的1是我们代码输出的结果,Press any key to continue则是程序运行完毕后编译器自行输出的东西,printf("\n");很好的分开了两者的输出;
(看到这里的人有可能觉得我讲的是废话,请见谅,我只是想详细的讲,因为刚入门学习c语言的人可能不知道后面这Press any key to continue是哪来的)
好,回到正题,代码里的putchar("1");输出了1,这就是putchar的一个用法,此外,输出字符1的方法还可以用putchar(49);代码和结果如下
#include <stdio.h>
int main(void)
{
putchar(49);
printf("\n");
return 0;
}复制代码
这个输出结果和前面那个例子是一样的,究竟是为什么呢?
在讲这个问题之前,我先讲讲putchar的函数原型,putchar这个函数的函数原型是这样的:
int putchar(int c);
这行代码的意思是什么呢?这涉及到函数的定义,在之后有时间的时候我会写一篇关于函数定义的文章的,现在我就简单讲讲这int putchar(int c);的意思。首先看到第一个int,这个说明了这个函数返回的是1个int类型(即整型,表示一定范围内的整数,范围大小由机器位数以及编译器决定)的整数,我们看以下的例子,
#include <stdio.h>
int main(void)
{
int a;
a=putchar('1');
printf("%d\n",a);
return 0;
}
复制代码
它的输出结果如下为什么是149呢?
我们把这个代码写成下面那样,
#include <stdio.h>
int main(void)
{
int a;
a=putchar('1');
printf("\n");
printf("%d\n",a);
return 0;
}
复制代码
结果如下图,我们在赋值之后输出一个换行,这样就很容易讲明白了。我们仔细来讲讲。
首先,在定义了a这个整型之后,我们用了a=putchar('1');这行代码,这行代码许多人以为就是把putchar('1')这个函数返回的值赋给了a,但其实,在赋值之前,它先运行了等号右边的putchar('1')函数,所以先输出了个1,然后再把putchar返回的结果赋值给a,接着换行,再输出a的值,为49。所以上面的149其实是先输出了个1再输出49就变成了149,并不是说putchar返回的值是149,它返回的值其实是49。
那为什么是49呢?
最上面的例子表明了putchar('1'),putchar(49)输出的结果是一样的,后者括号里也是49,我们看会函数原型int putchar(int c),括号里定义了一个形式参数c,它的类型是整型,意思是说,要使用这个函数,括号里给的值必须是整型,而49就是一个整型的数,所以它可以用于putchar输出,那问题又来了,为什么括号里是'1'也能输出呢,这涉及到ASCII码,下图是ASCII码的图表,
看到十进制数49对应的就是字符1,所以说'1'和49其实是等价的,同理,看图表,'2'和50是等价的,'p'和112是等价的,所以说putchar('1')等价与putchar(49)。在ASCII表中,分有非打印控制字符和打印字符,其中前者的字符是不可以打印,后者可以打印,你可以用putchar(1),把里面的1换成1到31都试一下,你会发现,运行结果是有输出的,但并不是表上对应的字符,而32到127都可以输出表上对应的字符(127不知道什么回事,我的输出不了,这我就不懂了)(32输出的是空格,空格也是字符),然后数字再大一点,例如putchar(148451);,输出的就是一个汉字 鉖 ,具体的自己可以去百度了解以下。
(2)利用整型变量或字符变量输出字符
1.整型变量,代码如下
#include <stdio.h>
int main(void)
{
int a=49;
putchar(a);
printf("\n");
return 0;
}复制代码
输出结果为2.字符变量,代码如下
#include <stdio.h>
int main(void)
{
char a='1';
putchar(a);
printf("\n");
return 0;
}复制代码
输出结果为
也很同意理解,定义一个字符变量a,把'1'赋值给它,再用putchar(a);输出,等价于putchar('1');
2.常见问题
(1)putchar()括号里一定要是数字或者是''括着一个字符(一个字符,一个字符,一个字符,不是2个或以上或没有)
假如是
putchar('457');复制代码
输出的是7,输出的是最后面的数字,如果数字再多一定,例如 putchar('457484');复制代码
编译时就会报错,错误信息为too many characters in constant;
而且'457'和'457484'这样写本身就是一个错误,单引号括的是1个字符,而不是多个字符,多个字符应该用""这对双引号来括,这样写就是对的,"457","457484",但是,这不代表着putchar("457484")和putchar("457")这样写就是对的,这样写的话编译时不会报错,会输出,但输出的是什么我不清楚,感兴趣的小伙伴可以自己研究下,然后告诉我结果哦,资源共享,嘻嘻,回到正题,编译时虽然不会报错,但它会提醒你'int ' differs in levels of indirection from 'char [7]'和different types for formal and actual parameter 1这两串英语,意思就是括号里应该给的时整型而不是字符串,这里的char[7]代表的就是一串大小为6个字符的字符串,如果是char[9]就是8个字符的字符串,char[18]为17个字符的字符串,以此类推。
(2)putchar()里面给了字符,而且是一个,但是报错了
原因:
1.你的字符没有用''这对单引号括上,或者是你用了中文的单引号,一定要用英文的单引号;你写了个putchar(a),其实你想的是输出a这个字符,但没有单引号,就会报错undeclared identifier;
2.报错undeclared identifier,表示未定义,括号里的变量没有定义,无法输出;
第一次写博客,如果写的不好,请见谅!!谢谢阅读。