精华内容
下载资源
问答
  • C语言输出DEBUG调试信息方法

    万次阅读 2015-05-13 10:30:48
    但是我们在程序BUG修复后,又会特别烦我们之间插入的哪些调试语句,客户不会理解我们那些调试语句曾经又多少汗马功劳,而太多调试语句也影响我们程序运行时输出的美观和清晰,于是很多情况下我们需要手动将那些...

    问题提出


    我们在调试程序时,输出调试信息(又称为”打桩”或者”插桩”)是一种普遍、有效的方法。

    我们输出的信息通常包括行号、函数名、程序变量等。

    但是我们在程序BUG修复后,又会特别烦我们之间插入的哪些调试语句,客户是不会理解我们那些调试语句曾经又多少汗马功劳,而太多的调试语句也影响我们程序运行时输出的美观和清晰,于是很多情况下我们需要手动将那些调试语句注释掉或者删掉,这对于小项目来说,我们还可以忍受,但是对于大项目,如果我们还是手动删除,我们只能。。。。呵呵,这不是程序猿该干的事。。。

    下面我们给出几种调试方式方便大家使用。

    手工环境下BUG程序中的调试信息


    /*  debug.c  */
    #include <stdio.h>
    #include <stdlib.h>
    
    //#define DEBUG
    
    /*  计算n的阶乘n!  */
    long Fac(int n);
    
    /* 主函数
     * 输入一个n计算n的阶乘  */
    int main(void)
    {
        int     n;
        long    fac;
    
        while(scanf("%d", &n) != EOF)
        {
            printf("%d! = %ld\n", n, Fac(n));
        }
    
        return EXIT_SUCCESS;
    }
    
    
    /*  计算n的阶乘n!  */
    long Fac(int n)
    {
        int i;
        long fac;
    
        for(i = 1; i <= n; i++)
        {
            fac *= i;
            printf("调试信息 %d! = %ld\n", i, fac);/*  调试信息  */
    
        }
    
        return fac;
    }

    这个程序是有BUG的,在程序第40行,变量fac未初始化为1。

    插入的调试信息

    printf("%d! = %ld\n", i, fac);/*  调试信息  */

    在不需要时我们只能将此调试信息注释掉,这个是最原始,最人工的一种方式。

    优势
    方便简单,易于操作,简单易读
    缺点
    非常灵活,单一的调试信息会造成错误输出过于冗余

    用预处理指令封装调试信息


    通过预处理指令将调试信息封闭起来,如下

    #ifdef DEBUG
            printf("%d! = %ld\n", i, fac);
    #endif
    

    这样调试的信息只存在与插桩信息宏DEBUG的预处理指令下,如果需要打开调试信息就定义插桩信息宏DEBUG,否则就将插桩信息宏DEBUG注释掉(也可以undef或者删掉)。

    这样我们的代码就变成

    /*  debug.c  */
    #include <stdio.h>
    #include <stdlib.h>
    
    /*  插桩信息宏  */
    #define DEBUG   /*  如果需要调试信息请使用该宏,如果想取消调试信息,请注释掉或者*/
    //#undef DEBUG   /*  取消插桩信息宏DEBUG  */
    
    /*  计算n的阶乘n!  */
    long Fac(int n);
    
    /* 主函数
     * 输入一个n计算n的阶乘  */
    int main(void)
    {
        int     n;
        long    fac;
    
        while(scanf("%d", &n) != EOF)
        {
            printf("%d! = %ld\n", n, Fac(n));
        }
    
    
        return EXIT_SUCCESS;
    }
    
    /*  计算n的阶乘n!  */
    long Fac(int n)
    {
        int i;
        long fac;
    
        for(i = 1; i <= n; i++)
        {
            fac *= i;
    
    #ifdef DEBUG
            printf("调试信息 %d! = %ld\n", i, fac);
    #endif
        }
    
        return fac;
    }
    

    其实我们也可以不在代码中添加插桩信息宏DEBUG,gcc为我们提供了一个更简单的方法,那就是gcc -D编译选项

    -DDEBUG 以字符串“1”定义 DEBUG 宏。   
    -DDEBUG=DEFN 以字符串“DEFN”定义 DEBUG 宏。   

    因此我们可以直接

    gcc -DDEBUG debug.c -o debug

    用预处理指令封装调试信息

    优势
    方便简单,易于操作,简单易读
    缺点
    ①不灵活,单一的调试宏,对于小项目来说可以,但是对于大项目同样会造成错误输出过于冗余,在大项目中,为了增加灵活性,往往通过定义多个等级的DEBUG(如DEBUG1,DEBUG2,DEBUG3等)或者不同名称的DEBUG(如DEBUG_DATA,DEBUG_COMM,DEBUG_APP等),来为不同的模块,或者错误等级进行调试,但是也会引入其他一些更复杂的问题,如项目难以管理,难以整合等问题。
    ②每个调试信息都会被成对的预处理指令包含,造成项目代码的过度膨胀,延长预处理时间;同时也不利于代码的阅读。

    预处理指令+自定义调试函数


    通过预处理指令定义调试函数的不同实现


    (编译阶段)能避免使用宏可能带来的副作用,而且方便日后定制debug信息的输出,特别方便维护和修改。我可以随时修改它,比如打印到网络服务器,本地文件,其他终端等,很方便的重定向。这是我最喜欢使用的方法。

    #ifdef DEBUG
    static int DebugPrintf(const char *format, ...)
    {
        va_list argPtr;
        int     count;
    
        va_start(argPtr, format);                  /*  获取可变参数列表  */
        fflush(stdout);                            /*  强制刷新输出缓冲区  */
        count = vfprintf(stderr, format, argPtr);  /*  将信息输出到标准出错流设备  */
        va_end(argPtr);                            /*  可变参数列表结束  */
    }
    #else
    static inline int DebugPrintf(const char *format, ...)
    {
    
    }
    #endif

    或者

    static int DebugPrintf(const char *format, ...)
    {
    #ifdef DEBUG
    
        va_list argPtr;
        int     count;
    
        va_start(argPtr, format);                  /*  获取可变参数列表  */
        fflush(stdout);                            /*  强制刷新输出缓冲区  */
        count = vfprintf(stderr, format, argPtr);  /*  将信息输出到标准出错流设备  */
        va_end(argPtr);                            /*  可变参数列表结束  */
    
    #else
        /*  未定义插桩调试宏DEBUG,NOP空函数体  */
        /*
        do
        {
        }while(0);
        */
    #endif
    }

    这里我们依旧使用了插桩调试宏DEBUG,但是在宏定义和未定义的时候,分别定义了不同的DebugPrintf调试信息函数。这种方法的本质其实就是重写了一个我们自己的printf函数,在Glibc或者其他C运行库中,printf就是用vfprintf或者vprintf来实现的。

    在定义了插桩调试宏DEBUG时,DebugPrintf被定义为一个向标准出错流输出信息的输出函数。但是在未定义插桩调试宏DEBUG时,DebugPrintf被定义为一个内联的空函数(当然也可以不使用内联,但是空函数为增加额外开销,C语言本身是不支持内联函数的,在C标准C99中C语言支持了内联函数)。
    其中的空函数体不是很清晰,如果别人看我们代码的时候,可能会很疑惑为什么,我们可以加上注释或者采用如下代码代替

    do
    {
    }while(0);

    这样我们同样通过插桩调试宏DEBUG的定义与否来实现调试信息的开启和关闭。
    这样我们的程序就变为

    //debugprintf.c
    #include <stdio.h>
    #include <stdlib.h>
    
    
    //#define DEBUG
    //#undef DEBUG
    
    #ifdef DEBUG
    #include <stdarg.h>
    static int DebugPrintf(const char *format, ...)
    {
        va_list argPtr;
        int     count;
    
        va_start(argPtr, format);                  /*  获取可变参数列表  */
        fflush(stdout);                            /*  强制刷新输出缓冲区  */
        count = vfprintf(stderr, format, argPtr);  /*  将信息输出到标准出错流设备  */
        va_end(argPtr);                            /*  可变参数列表结束  */
    }
    
    #else
    
    static inline int DebugPrintf(const char *format, ...)
    {
    
    }
    
    #endif
    
    /*  计算n的阶乘n!  */
    long Fac(int n);
    
    /* 主函数
     * 输入一个n计算n的阶乘  */
    int main(void)
    {
        int     n;
        long    fac;
    
        while(scanf("%d", &n) != EOF)
        {
            printf("%d! = %ld\n", n, Fac(n));
        }
    
    
        return EXIT_SUCCESS;
    }
    
    
    /*  计算n的阶乘n!  */
    long Fac(int n)
    {
        int i;
        long fac = 1;
    
        for(i = 1; i <= n; i++)
        {
            fac *= i;
    
            DebugPrintf("调试信息 %d! = %ld\n", i, fac);
        }
    
        return fac;
    }

    通过预处理指令定义调试函数的不同实

    定义调试函数并通过宏定义重定向调试函数


    这种方式跟上一种方式有点区别,但是本质上是一样的,上面我们看到,我们通过插桩调试宏来控制调试函数的不同实现,未定义插桩信息宏时,调试函数被定义会空函数,但是这种方式有个缺点,就是会造成目标代码的膨胀。

    下面这种方式,我们首先实现一个调试函数,然后通过宏定义来指向

    #include <stdarg.h>
    static int MyDebugPrintf(const char *format, ...)
    {
        va_list argPtr;
        int     count;
    
        va_start(argPtr, format);                  /*  获取可变参数列表  */
        fflush(stdout);                            /*  强制刷新输出缓冲区  */
        count = vfprintf(stderr, format, argPtr);  /*  将信息输出到标准出错流设备  */
        va_end(argPtr);                            /*  可变参数列表结束  */
    }
    
    #ifdef DEBUG   /*  如果定义了插桩信息宏,就将调试信息指向调试函数  */
        #define DebugPrintf  MyDebugPrintf
    
    #else           /*  如果未定义插桩信息宏,那么就将调试信息指向空NOP  */
        #define DebugPrintf
    
    #endif

    这样我们的程序变为

    #include <stdio.h>
    #include <stdlib.h>
    
    
    //#define DEBUG
    //#undef DEBUG
    
    #include <stdarg.h>
    static int MyDebugPrintf(const char *format, ...)
    {
        va_list argPtr;
        int     count;
    
        va_start(argPtr, format);                  /*  获取可变参数列表  */
        fflush(stdout);                            /*  强制刷新输出缓冲区  */
        count = vfprintf(stderr, format, argPtr);  /*  将信息输出到标准出错流设备  */
        va_end(argPtr);                            /*  可变参数列表结束  */
    }
    
    #ifdef DEBUG   /*  如果定义了插桩信息宏,就将调试信息指向调试函数  */
        #define DebugPrintf  MyDebugPrintf
    
    #else           /*  如果未定义插桩信息宏,那么就将调试信息指向空NOP  */
        #define DebugPrintf
    
    #endif
    
    
    
    /*  计算n的阶乘n!  */
    long Fac(int n);
    
    /* 主函数
     * 输入一个n计算n的阶乘  */
    int main(void)
    {
        int     n;
        long    fac;
    
        while(scanf("%d", &n) != EOF)
        {
            printf("%d! = %ld\n", n, Fac(n));
        }
    
    
        return EXIT_SUCCESS;
    }
    
    
    /*  计算n的阶乘n!  */
    long Fac(int n)
    {
        int i;
        long fac = 1;
    
        for(i = 1; i <= n; i++)
        {
            fac *= i;
    
            DebugPrintf("调试信息 %d! = %ld\n", i, fac);
        }
    
        return fac;
    }
    

    定义调试函数并通过宏定义重定向调试函数

    不定义调试函数而直接使用printf


    前面的两种方法,我们都是用vfprintf或者vprintf自己重新实现了一个输出函数,但是我们要想了我们是否可以使用printf函数呢,当然可以了

    #ifdef DEBUG
    
    #define DebugPrintf(format, arg...)              \
               printf(format, ## arg)
    
    #else
    
    #define DebugPrintf(format, arg...) do {  } while (0)
    
    #endif
    

    代码如下

    #include <stdio.h>
    #include <stdlib.h>
    
    
    //#define DEBUG
    //#undef DEBUG
    
    
    
    #ifdef DEBUG
    
    #define DebugPrintf(format, arg...)              \
               printf(format, ## arg)
    
    #else
    
    #define DebugPrintf(format, arg...) do {  } while (0)
    
    #endif
    
    
    /*  计算n的阶乘n!  */
    long Fac(int n);
    
    /* 主函数
     * 输入一个n计算n的阶乘  */
    int main(void)
    {
        int     n;
        long    fac;
    
        while(scanf("%d", &n) != EOF)
        {
            printf("%d! = %ld\n", n, Fac(n));
        }
    
    
        return EXIT_SUCCESS;
    }
    
    
    /*  计算n的阶乘n!  */
    long Fac(int n)
    {
        int i;
        long fac = 1;
    
        for(i = 1; i <= n; i++)
        {
            fac *= i;
    
            DebugPrintf("调试信息 %d! = %ld\n", i, fac);
        }
    
        return fac;
    }
    

    不定义调试函数而直接使用printf

    使用全局变量(不推荐)

    这种方式其实就是将原来定义的调试信息宏DEBUG更换未全局变量isDebug

    static int isDebug = 0;
    
    #define DebugPrintf(format, arg...)                  \
                do
                {                                            \
                    if (isDebug)                        \
                    printf(format , ## arg);   \
            } while (0)
    

    带调试等级的插桩调试信息


    前面的方法,如果进行调试或者取消调试,都需要重新编译,这样我们就可以使用调试等级来确定。
    我们可以根据调试信息的细节程度,将调试信息分成不同的等级。调试信息的等级必须大于0,若调试信息细节程度越高,则等级越高。在输出调试信息时,若调试等级高于调试信息等级才输出调试信息,否则忽略该调试信息,如程序5。当调试等级为0时,则不输出任何调试信息。

    下面我们以通过预处理指令定义调试函数的不同实现为例子,说明以下带调试等级的插桩调试信息

    //debugprintf.c
    #include <stdio.h>
    #include <stdlib.h>
    
    
    static int debugLevel  = 0;
    #include <stdarg.h>
    
    static int DebugPrintf(const char *format, ...)
    {
        if (debugLevel >= 1)
        {
            va_list argPtr;
            int     count;
    
            va_start(argPtr, format);                  /*  获取可变参数列表  */
            fflush(stdout);                            /*  强制刷新输出缓冲区  */
            count = vfprintf(stderr, format, argPtr);  /*  将信息输出到标准出错流设备  */
            va_end(argPtr);                            /*  可变参数列表结束  */
        }
    }
    
    
    
    
    
    /*  计算n的阶乘n!  */
    long Fac(int n);
    
    /* 主函数
     * 输入一个n计算n的阶乘  */
    int main(int argc, char *argv[])
    {
        if(argc < 2)
        {
            debugLevel = 0;
        }
        else
        {
            debugLevel = atoi(argv[1]);
        }
    
        int     n;
        long    fac;
    
        while(scanf("%d", &n) != EOF)
        {
            printf("%d! = %ld\n", n, Fac(n));
        }
    
    
        return EXIT_SUCCESS;
    }
    
    
    /*  计算n的阶乘n!  */
    long Fac(int n)
    {
        int i;
        long fac = 1;
    
        for(i = 1; i <= n; i++)
        {
            fac *= i;
    
            DebugPrintf("调试信息 %d! = %ld\n", i, fac);
        }
    
        return fac;
    }
    

    带调试信息的插桩信息

    展开全文
  • 5. 05 C语言 函数

    2015-05-20 01:12:34
    函数是什么?    常见库函数都有哪些?    自定义函数一般形式是什么?    形参和实参是什么?    函数调用如何实现?  作业 :  1、动态...

    函数是什么? 

     

    常见的库函数都有哪些? 

     

    自定义函数的一般形式是什么? 

     

    形参和实参是什么? 

     

    函数的调用如何实现? 


    作业 :  

    1动态输入三个整数,写一个函数,返回最大值并输出该值; 

     

    int getMax(int x, int y, int z) { 

         

        int temp = 0; 

        temp = x > y ? x : y; 

        return temp > z ? temp : z; 

         

    } 

     

    2、写一个函数,返回输入整数(大于999小于10000)的每位的数字之和。 

     

    int getDigitSum(int n) { 

         

        int result = 0; 

         

        result = n % 10 + n % 100 / 10 + n % 1000 / 100 + n / 1000; 

         

        return result; 

         

    } 

     

    3、写一个函数,将传入的字符串转为全大写,数字和符号不变。 

     

    void uppercase(char str[], unsigned long length) { 

         

        int i = 0; 

         

        while (str[i] != '\0' && i < length) { 

             

            if (str[i] >= 'a' && str[i] <= 'z') { 

                

                str[i] -= 32; 

            } 

           

            i++; 

        } 

        

        puts(str); 

         

    } 

     

     

    4、写一个函数返回一个int数组中的最大重复数(数组元素的重复次数为该元素在数组中出现的次数),如{1132323}最大重复数为(注意:打印输出的是,重复次数最多,该数的值 

     

    方法一:注意,本方法只适用于数组元素全部为非负数的情况。 

    //找出最大重复数 (填坑法) 

     

    int getMaxRepeat(int arr[], int length) { 

         

        int result = 0; 

        int index = 0; 

        int tempArray[50] = {0}; 

        int max = 0; 

        int maxIndex = 0; 

         

        for (int i = 0; i < length; i++) { 

            

            index = arr[i];     //遍历,arr数组的值做为下标 

             

            tempArray[index]++;  // tempArray[index]对应的值+1 

         

        } 

         

        for (int j = 0; j < 50; j++) { 

             

            if (max < tempArray[j]) { 

                 

                max = tempArray[j];   //找到tempArray数组的最大值的位置 

                 

                maxIndex = j; 

            } 

            

        } 

         

        result = maxIndex; 

         

        return result; 

    } 

     

     

    方法二(better): 

     

    int getRecur(int array[], int length) { 

         

        // times:当前这个数重复了多少次 

        // max:重复最多的【次数】 

        // theNum:重复次数最多的数 

        int times = 0, max = 0, theNum = array[0]; 

         

        for (int i = 0; i < length; i ++) { 

             

            for (int j = 0; j < length; j ++) { 

                 

                if (array[i] == array[j]) { 

                     

                    times ++; 

                } 

            } 

             

            if (times > max) { 

                 

                max = times; 

                theNum = array[i]; 

            } 

            times = 0; 

        } 

        return theNum; 

    } 

     


    展开全文
  • 使用输入输出函数要包含stdio.h。使用数学函数,要包含math.h头文件。 2. 字符串结束标志符’\0’。”asdgggg” 3. x++先使用后加1。++x先加1后使用。 4. 三目运算符:?:。如果:a=6,b=7,那么a>b?a+b+2:...
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回指针指向返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致局部数组,或者由其他参数...
  • C语言学习笔记——格式化输入输出

    千次阅读 2016-07-14 18:16:34
    输入可以有三种方式:scanf(),getchar(),gets(),它们有...scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入信息。可以读入任何固有类型数据并自动把数值变换成适当机内格式。 其调用格式

    输入可以有三种方式:scanf(),getchar(),gets(),它们有哪些区别呢?

    1.  scanf()

    功 能: 执行格式化输入
    用 法: int scanf(char *format[,argument,...]);
    scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
    其调用格式为: scanf("<格式化字符串>",<地址表>);
    scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

    而scanf()是拥有缓冲区的,举个例子

    程序运行到scanf()时会停止  请求外界输入

    也许你输入了12然后回车了,但事实上 你从键盘上输入的是字符'1''2', 还有换行符'\n'  (因为你键入了回车),在你按回车键之前,字符'1''2'都处于一个叫做缓冲区的位置里,回车键是特殊的,它先将字符'\n'添加到缓冲区,随后便清除缓冲区 ,将其中的所有字符发送到一个叫做输入列表的地方 ,scanf函数以及其他标准输入函数便会立刻从输入列表中获取内容

    上述程序按照%d的规则从输入列表中获取字符 ,它获取了'1''2',并且将其转变为整数12,存入了变量n中,对于那些从输人列表中获取输入的函数 ,它们并不知道什么是整数 , 因为整数是编程中的概念,而无论是缓冲区还是输入列表,其中只有字符,所以“获取整数”只是从结果上看的,我们要求scanf获取一个整数到n中,它完成了但是并没有结束, 因为输入列表并不干净,回车符'\n'仍然留在输入列表中,第二个scanf将不会给你输入的机会 ,因为缓冲区中剩余的'\n'已经足够填饱ch的肚子,所以中间加一个getchar(),以获取‘\n’;

    解决该问题的第二种方法是scanf(“ %d”,&num1),按格式输出前加一个空格;

    2.  scanf()与gets 的区别

    (1),scanf()读句子的时候,会将所有的字符读入缓冲区中,而scanf()函数取数据是遇到回车、空格、TAB就会停止,不能获得一个句子;而gets()可以获得一个句子,因为gets没有缓冲区,所以可能会出现越界的情况;

    但用以下方法可使得scanf获得一个句子:

    3.getchar

    我们可以用getchar 处理越界的情况:

    如下:

    其特点是:效率低,但是可以控制越界。

    另外,C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!这个函数是fflush(stdin)。

     

     

    展开全文
  • C语言学习路线

    2020-12-22 19:05:46
    5.输入输出函数 字符串输入输出 6.选择程序结构 if语句,if else语句 使用 switch语句 使用 7.循环语句 for循环、while循环、do while循环运用 ②进阶篇 1.数组 一堆数组、二堆数组、字符数组 数组运用...

    ①入门篇

    1.了解C语言

    C语言历史
    C语言特点

    2.算法

    什么是算法
    算法有哪些

    3.数据类型

    C语言包含的数据类型
    变量的命名规则
    常量、变量

    4.运算符与表达式

    什么是运算符
    什么是表达式

    5.输入输出函数

    字符串的输入输出

    6.选择程序结构

    if语句,if else语句 使用
    switch语句 使用

    7.循环语句

    for循环、while循环、do while循环运用


    ②进阶篇

    1.数组

    一堆数组、二堆数组、字符数组
    数组的运用方式

    2.排序方法

    选择排序、冒泡排序、插入排序

    3.函数

    函数的定义
    函数的参数与返回值

    4.指针

    指针变量运算
    数组指针、字符串指针、二级指针、函数指针

    5.字符串

    字符串输入输出
    字符串处理函数
    字符串长度获取、大小写转换


    ③终极篇

    1.结构体

    结构体指针、结构体数组
    C语言枚举类型、共同体、位运算

    2.文件操作

    文件打开与关闭
    文件读写

    3.内存管理

    内存组织方式
    动态内存分配

    展开全文
  • C语言自增运算符置于变量前和变量后区别与理解自加自减运算符概念:在普通语句定义并用printf函数输出结果for循环中作为判断条件结语Reference 自加自减运算符概念: 自增自减运算符存在于C/C++/C#/Java/...
  • C语言编程要点

    2017-09-18 00:10:37
    7.26. free()函数是怎样知道要释放内存块大小? 126 7.27. 可以对void指针进行算术运算吗? 127 7.28. 怎样打印一个地址? 127 第8章 函 数 127 8.1. 什么时候说明函数? 128 8.2. 为什么要说明函数原型? 129 8.3....
  • C语言部分知识

    2015-07-23 21:11:07
    main函数是C语言程序入口(开始执行位置),{}表示main函数起止点 2怎样理解注释增强代码可读性和可维护性?  //、/**/对代码解释说明 3C语言中有哪些基本数据类型,占字节数,以及格式化描述形式...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
  •  本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并...
  • 首先,我们先要有个框架,即实现上上述功能要有哪些函数。首先,先要表示边框(蛇移动范围)及蛇,然后要设定一个死亡条件,在没有死亡条件下,读入指令控制蛇移动,并输出相应图像。每次输出完要清空屏幕再...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回指针指向返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致局部数组,或者由...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回指针指向返回指针的函数……,如此往复,以至无穷。  数组大小  1.23 能否声明和传入数组大小一致局部数组,或者由其他参数...
  • C语言程序设计 第1章 一个C程序由什么构成 函数的描述形式怎样 函数怎样构成 main函数跟其他函数有些什么不同 注释起何作用是否对程序产生影响 用源程序产生可执行程序应该经过哪些步骤 第2章 标识符...
  • 可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回指针指向返回指针的函数……,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致局部数组,或者由其他参数...
  • 本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别...
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    难道在C语言中一个结构不能包含指向自己指针吗? . . . . 3 1.7 怎样建立和理解非常复杂声明?例如定义一个包含N 个指向返 回指向字符指针的函数的指针数组? . . . . . . . . . . . . . . 3 1.8 函数只定义...
  •  本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并...
  • 本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别...
  • 本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别...
  • C语言编程经验总结

    2016-05-29 21:33:46
    编程首先要有明确思路才能进入coding阶段,简单举一个函数的例子: 1、首先明确函数要实现什么功能,可以采用哪几种算法; 2、综合考虑当前情况, 从备选算法中选出适合当前情况实现方法; 3、明确函数借口,...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    输出电压测试:测量每个输出接脚的输出电压位准。  相关频率特性(AC)测试,也通过外灌一定频率,从I/O口来看输出是否与之匹配。  为了保证IC生产的长期且稳定品质,还会做产品的可靠性...
  • 在1983年,美国国家标准协会(ANSI)成立了一个委员会,它的目标产生“一个无二义性的、独立于机器的C语言的定义”,同时仍保持其精髓。其结果就是C的ANSI标准。此标准规范了一些在本书第1版中提示过但没有描述的...

空空如也

空空如也

1 2 3 4 5
收藏数 93
精华内容 37
关键字:

c语言的输出函数是哪些

c语言 订阅