`

从C语言中printf开始

阅读更多

 

题目:

 

 

# 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格式详细介绍 在 C 语言中,printf 函数是一个非常重要的输出函数,它可以根据不同的格式化字符串来输出各种类型的数据。在本文中,我们将详细介绍 printf 函数的使用方法和格式化字符串的规定符。 ...

    C语言里printf函数完整用法

    C语言里printf函数格式控制符的完整格式 printf的格式控制的完整格式: % - 0 m.n l或h 格式字符

    C语言中printf函数的功能注解

    ### C语言中printf函数的功能注解 #### 一、引言 在C语言编程中,基本的输入输出功能主要是通过调用标准库函数实现的。其中,`printf`函数是功能强大且常用的输出函数之一。本文将详细介绍`printf`函数的功能,并...

    C语言中printf的使用.zip_C语言_printf函数

    printf()函数是式样化输出函数, 一般用于向准则输出设备按规定式样输出消息。正在编写步骤时经常会用到此函数。printf()函数的挪用式样为: printf(&quot;&lt;式样化字符串&gt;&quot;,&lt;参量表&gt;);

    C语言中printf函数的功能注解.pdf

    《C语言中printf函数的功能注解》 C语言是一门基础且强大的编程语言,其中的printf函数是进行输出操作的核心工具。本文详细阐述了printf函数的功能,并提供了在使用过程中应注意的事项,旨在帮助读者更准确、高效地...

    printf用法大全,C语言printf格式控制符一览表.docx

    ### C语言printf函数详解 #### 一、printf函数概述 `printf`函数是C语言中最常用的输出函数之一,用于向标准输出设备(通常是屏幕)输出指定格式的数据。它定义在`stdio.h`头文件中,因此在使用时需要包含此头文件...

    C语言中printf函数的功能注解[收集].pdf

    在C语言中,`printf`函数是一个非常重要的输出函数,用于在控制台上打印各种类型的数据。这篇文章详细介绍了`printf`函数的功能以及使用时需要注意的事项,对于理解和掌握C语言的基本输入输出具有指导意义。 首先,...

    C语言实现Printf函数完整工程文件

    在C语言中,`printf`函数是用于格式化输出数据的标准库函数,它在`stdio.h`头文件中被定义。这个"C语言实现Printf函数完整工程文件"提供了一个自定义实现`printf`功能的机会,这有助于理解其内部工作原理,并可以...

    单片机C语言实现printf.pdf

    在单片机编程中,使用C语言的`printf`函数是一项基础且重要的技能,特别是在进行串口通信时。`printf`函数允许开发者以格式化的字符串输出数据,这对于调试和信息传递非常有用。在51单片机上实现`printf`功能,需要...

    单片机编程技巧 ,C语言自创printf()串口格式输出,优势:适用于程序空间紧缺的单片机,占用资源空间远远小于系统自带

    “C语言”标签表明这个函数是基于C语言实现的,C语言在单片机编程中广泛使用,因为它提供了直接访问硬件的能力,且代码较为高效。“printf”标签直接指出了讨论的核心,即对`printf()`函数的改进。“单片机”标签则...

    C语言中printf()缓冲问题详解

    C语言中printf()缓冲问题详解 C语言中printf()缓冲问题是指在使用printf()函数时,因为缓冲机制的存在,可能会出现输出结果的延迟或不确定性。本文将详细介绍C语言中printf()缓冲问题的相关知识,包括缓冲...

    C语言IO--printf右对齐补零

    C语言IO中,printf函数是格式化输出函数,用于向标准输出设备按规定格式输出信息。printf函数的调用格式为:printf("&lt;格式化字符串&gt;", &lt;参量表&gt;); 其中,格式化字符串包括两部分内容:一部分是正常字符,这些字符将...

    C语言教学中printf函数功能解析.pdf

    在C语言中,printf函数是一个非常重要的标准输入输出库函数,广泛用于程序的数据输出。它的作用是根据给定的格式控制字符串,将输出表列中指定的数据输出到显示器或其他指定的输出设备。printf函数属于C语言标准库中...

    详解C语言中printf输出的相关函数

    C语言printf()函数:格式化输出函数 printf()函数是最常用的格式化输出函数,其原型为: int printf( char * format, ... ); printf()会根据参数 format 字符串来转换并格式化数据,然后将结果输出到标准输出...

    printf函数的原型和重定义

    printf 函数是 C 语言中一个常用的输出函数,它可以将格式化的字符串输出到标准输出设备上。在嵌入式开发领域中,printf 函数经常被重定义以满足特定的需求。本文将详细介绍 printf 函数的原型和重定义方法。 一、...

    C语言变参_实现自己的printf

    C语言变参_实现自己的printf,详细讲解变参在堆栈中的存放和读取,讲解如何实现一个变参函数,最终给出实现一个printf的参考,对于不能支持printf的系统非常有帮助,建议使用标准头文件stdarg.h。

    C语言版本的第三方printf函数实现

    在IT行业中,C语言是一种广泛使用的底层编程语言,尤其在嵌入式系统和单片机程序开发中扮演着重要角色。对于这些资源受限的环境,标准C库中的printf函数可能会过于庞大,不适合有限的内存和处理能力。因此,出现了第...

    c语言中文API

    2. **输入/输出(I/O)操作**:C语言中的标准输入输出库stdio.h提供了printf、scanf等函数,用于在终端进行数据的读写。比如,printf用于输出信息,scanf则用于从键盘接收输入。 3. **内存管理**:C语言提供了...

Global site tag (gtag.js) - Google Analytics