题目:
# include <stdio.h>
void hello () { printf(“ Hello, world!\n”); }
int main ()
{
hello(); return 0;
}
试修改上面的程序,使其输出变成:
Begin
Hello, world!
End
限制:( 1 )不能对 main() 进行任何修改;( 2 )不能修改 hello() 中的 printf 语句,也不能在 hello() 中增加任何其他可执行语句。
解法一:
#include <stdio.h>
#include <stdarg.h>
void hello ()
{
printf(" Hello, world!\n");
}
int main ()
{
hello();
return 0;
}
int printf(const char *format, ...)
{
va_list unnamed_p;
char *p, *sval;
char *m = "Begin\n";
char *n = "End\n";
unsigned int value_i;
va_start(unnamed_p, format);
for(p = (char *)m; *p; p++) //输出"Begin\n"
{
putchar(*p);
}
for (p = (char *)format; *p; p++ ) //输出printf函数的参量
{
putchar(*p);
}
for(p = (char *)n; *p; p++) //输出"End\n"
{
putchar(*p);
}
va_end(unnamed_p);
return 0;
}
分析一:
若老师的目的是:一是学习“重写”printf方法;二是读懂printf,学习printf算法的编程思想。则可采用上述解法。
1、C语言中printf函数的算法深刻的体现了数据与操作的独立性,极大的增强了printf的可重用性。
2、printf函数对于可变形参的处理,使我们想输出几类或几个形参,就可以输出几类或几个形参。
3、printf函数作为一个构件来看,其对接口的要求也相当的宽松,可以做到不限制接口参数的个数。
4、此解法不严格的说法是:重写printf方法。但严格的说,并不是重写。和编译的过程有关,当编译器发现当前.CPP文件中有printf函数时,便不再在C库中寻找printf函数(相当于将其屏蔽掉了),这样,我们将再也无法在本.CPP中的printf辖域内使用C库中的printf函数。
5、而重写的一个重要表现是:我们可以使用父类中虽已在子类中重写的方法(只需要定义一个父类的对象,使用此对象调用方法即可)。
6、单就“重写”printf来说,有一个好处,例如,公司的单据或文件格式通常都是固定的,只需要对printf做一次“重写”,就不用再关心此类操作了。这体现了数据是可变的,但操作以及数据结构却可以保持相对长时间的不变性的思想与经验。
解法二:
#include <stdio.h>
class Test
{
public:
Test(){printf("Begin\n");}
~Test(){printf("End\n");}
};
Test Test1;
void hello()
{
printf(" Hello, world!\n");
}
int main ()
{
hello();
return 0;
}
分析二:
1、全局变量Test1初始化先于main()函数的执行,Test1通过Test类的constructor--Test()初始化,此时,便将“Begin”打印出来了。
2、析构函数的执行时间:如果此析构函数对应的类定义的对象是个局部对象,那么在此对象退出作用域时调用析构函数;如果是全局对象,则在整个程序结束(main()函数中调用return(),exit()等等)时析构;如果这个对象被分配在自由存储区中,当delete这个对象时调用析构函数。本解法二定义的是全局对象,在main()执行结束后,调用析构函数~Test(),此时,便将“End”打印出来了。
解法三:
#include <stdio.h>
#define printf(x) printf("Begin\n"x"End\n")
void hello()
{
printf(" hello,world!\n");
}
int main()
{
hello();
return 0;
}
总结:
最终,老师选择以解法二作为此题的正确答案,其对解法一的评价是该解法修改了printf语句。但我个人认为,解法一并没有修改hello() 中的 printf 语句,满足此题的第二个限制条件。若严格按照老师的意图,此题的限制条件二应改为“不能修改hello() 中的 printf 语句以及printf函数,也不能在 hello() 中增加任何其他可执行语句。”
分享到:
相关推荐
C语言中printf格式详细介绍 在 C 语言中,printf 函数是一个非常重要的输出函数,它可以根据不同的格式化字符串来输出各种类型的数据。在本文中,我们将详细介绍 printf 函数的使用方法和格式化字符串的规定符。 ...
C语言里printf函数格式控制符的完整格式 printf的格式控制的完整格式: % - 0 m.n l或h 格式字符
### C语言中printf函数的功能注解 #### 一、引言 在C语言编程中,基本的输入输出功能主要是通过调用标准库函数实现的。其中,`printf`函数是功能强大且常用的输出函数之一。本文将详细介绍`printf`函数的功能,并...
printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。printf()函数的挪用式样为: printf("<式样化字符串>",<参量表>);
在C语言中,printf函数是每个程序员必然会接触到的函数之一。它在程序中的作用非常广泛,主要用于向标准输出设备(通常是屏幕)上显示信息。printf函数的设计巧妙地结合了格式化输出与自由文本输出,使其成为了一个...
### C语言printf函数详解 #### 一、printf函数概述 `printf`函数是C语言中最常用的输出函数之一,用于向标准输出设备(通常是屏幕)输出指定格式的数据。它定义在`stdio.h`头文件中,因此在使用时需要包含此头文件...
在C语言中,`printf`函数是一个非常重要的输出函数,用于在控制台上打印各种类型的数据。这篇文章详细介绍了`printf`函数的功能以及使用时需要注意的事项,对于理解和掌握C语言的基本输入输出具有指导意义。 首先,...
在C语言中,`printf`函数是用于格式化输出数据的标准库函数,它在`stdio.h`头文件中被定义。这个"C语言实现Printf函数完整工程文件"提供了一个自定义实现`printf`功能的机会,这有助于理解其内部工作原理,并可以...
在单片机编程中,使用C语言的`printf`函数是一项基础且重要的技能,特别是在进行串口通信时。`printf`函数允许开发者以格式化的字符串输出数据,这对于调试和信息传递非常有用。在51单片机上实现`printf`功能,需要...
“C语言”标签表明这个函数是基于C语言实现的,C语言在单片机编程中广泛使用,因为它提供了直接访问硬件的能力,且代码较为高效。“printf”标签直接指出了讨论的核心,即对`printf()`函数的改进。“单片机”标签则...
C语言中printf()缓冲问题详解 C语言中printf()缓冲问题是指在使用printf()函数时,因为缓冲机制的存在,可能会出现输出结果的延迟或不确定性。本文将详细介绍C语言中printf()缓冲问题的相关知识,包括缓冲...
C语言IO中,printf函数是格式化输出函数,用于向标准输出设备按规定格式输出信息。printf函数的调用格式为:printf("<格式化字符串>", <参量表>); 其中,格式化字符串包括两部分内容:一部分是正常字符,这些字符将...
在C语言中,printf函数是一个非常重要的标准输入输出库函数,广泛用于程序的数据输出。它的作用是根据给定的格式控制字符串,将输出表列中指定的数据输出到显示器或其他指定的输出设备。printf函数属于C语言标准库中...
C语言printf()函数:格式化输出函数 printf()函数是最常用的格式化输出函数,其原型为: int printf( char * format, ... ); printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出...
printf 函数是 C 语言中一个常用的输出函数,它可以将格式化的字符串输出到标准输出设备上。在嵌入式开发领域中,printf 函数经常被重定义以满足特定的需求。本文将详细介绍 printf 函数的原型和重定义方法。 一、...
C语言变参_实现自己的printf,详细讲解变参在堆栈中的存放和读取,讲解如何实现一个变参函数,最终给出实现一个printf的参考,对于不能支持printf的系统非常有帮助,建议使用标准头文件stdarg.h。
在IT行业中,C语言是一种广泛使用的底层编程语言,尤其在嵌入式系统和单片机程序开发中扮演着重要角色。对于这些资源受限的环境,标准C库中的printf函数可能会过于庞大,不适合有限的内存和处理能力。因此,出现了第...
2. **输入/输出(I/O)操作**:C语言中的标准输入输出库stdio.h提供了printf、scanf等函数,用于在终端进行数据的读写。比如,printf用于输出信息,scanf则用于从键盘接收输入。 3. **内存管理**:C语言提供了...