学过C语言的都知道,我们在编译预处理指令时引入#include<stdio.h>头文件,其中用的最多的两个函数就是printf()函数和scanf()函数。一个输入、一个输出函数。
但是可能正是因为我们见的太多次,认为它太简单,反而忽视了一些问题。就比如,我们都知道printf()函数是输出函数,它可以格式化输出我们想要的结果。但是,既然它作为一个函数,是否具有返回值呢?返回值又是什么呢?
我们先来看一个例子:
printf("%d\n",printf("0123"));
这行代码乍一看,非常的简单,但是结果却有可能并不是你想的那样。据说,这是腾讯某一年的面试题目,难倒一大片求职人员。我们先来看看运行结果:
那么问题来了,为什么后面会跟个4呢?
查了相关一些资料,我明白了,在C语言中,printf()函数不仅可以将指定信息打印输出到屏幕上,同时这个函数在执行的过程中会存在一个返回值,返回值为要输出字符串的字符数(包括空格和换行符)。
所以最终结果显示的01234,其中0123是内层printf()输出的,同时,内层printf()函数产生一个返回值为4,作为第二层printf()函数的值输出出来。
看完printf,再来看看scanf,这个scanf()函数,据老师们的说法,在工作中很少使用,因为不安全,并且一大堆问题,这不,我在做作业的时候就碰到一个:
这是原来的代码:
#include<stdio.h>//exercise5-4
#include<ctype.h>
int main()
{
int i = 0;
char s[10000];
int alpha = 0, blank = 0, digit = 0, others =0;
printf("please enter a line of characters:");
scanf("%s",s);
for(;s[i] != '\0'; i++)
{
if(isalpha(s[i]))
{
alpha ++;
}
else if(s[i]==' ')
{
blank ++;
}
else if(isdigit(s[i]))
{
digit ++;
}
else
{
others ++;
}
}
printf("alpha:%d blank:%d digit:%d others:%d\n",alpha,blank,digit,others);
return 0;
}
运行结果:
后来我发现,是因为scanf的缘故,scanf函数在输入字符串的时候遇到空格会默认你输入结束。改进之后的代码:运用了getchar():
#include<stdio.h>//exercise5-4:统计字符串的类型个数
#include<ctype.h>
int main()
{
char s = 1;
int alpha = 0, blank = 0, digit = 0, others =0;
printf("please enter a line of characters:");
while((s=getchar()) != '\n')
{
if(isalpha(s))
{
alpha ++;
}
else if(s==' ')
{
blank ++;
}
else if(isdigit(s))
{
digit ++;
}
else
{
others ++;
}
}
printf("alpha:%d blank:%d digit:%d others:%d\n",alpha,blank,digit,others);
return 0;
}
运行结果:
这样就好了。