对于printf和scanf的新的认识

学过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;
}

运行结果:
在这里插入图片描述
这样就好了。

猜你喜欢

转载自blog.csdn.net/m0_46308273/article/details/104716225