精华内容
下载资源
问答
  • C51与标准C在printf中标识符的区别

    千次阅读 2014-01-07 14:39:55
    这个输出与标准C中printf函数有所不同,扩展出了“b,h,l”用于输入字节宽的设置,其中, b表示8位, h表示16位, l表示32位。 例如,unsigned char a={0xA7} 标准C中,输出a的语句为 printf("%02X",a); ...

    在用Keil开发C51程序时,可以利用其扩展的printf函数进行输出。

    这个输出与标准C中的printf函数有所不同,扩展出了“b,h,l”用于输入字节宽的设置,其中,

    b表示8位,

    h表示16位,

    l表示32位。

    例如,unsigned char a={0xA7}

    标准C中,输出a的语句为 printf("%02X",a);

    C51中,输出a的语句为printf("%b02X",a);

    其中b为输出byte字符的标识符,02表示限制为至少两位,X为十六进制标识符。

    展开全文
  • 标准库函数的默认输出设备是显示器,要实现串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ /* ...

    想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式)。

    标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.
    例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:
    #ifdef __GNUC__
    /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
         set to 'Yes') calls __io_putchar() */
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    #endif /* __GNUC__ */
    PUTCHAR_PROTOTYPE //通过宏替换相当于int fputc(int ch,FILE *f)
    {
     /* Place your implementation of fputc here */
     /* e.g. write a character to the USART */
     USART_SendData(USART1, (uint8_t) ch);
     /* Loop until the end of transmission */
     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
     return ch;
    }
    因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行,以下是解决方法:
    方法1.使用微库,因为使用微库的话,不会使用半主机模式.
    方法2.仍然使用标准库,在主程序添加下面代码:
    #pragma import(__use_no_semihosting) 
    _sys_exit(int x) 

    x = x; 

    struct __FILE 

    int handle; 
    /* Whatever you require here. If the only file you are using is */ 
    /* standard output using printf() for debugging, no file handling */ 
    /* is required. */ 
    }; 
    /* FILE is typedef’ d in stdio.h. */ 
    FILE __stdout;
    如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB;今天参考了一下论坛,使用微库可以很好的解决这个问题。
    2.另一种方法:(其实大同小异)  
    需要添加以下代码 
    (论坛里应该有完整介绍这个的帖子,但是我没搜到,也许是沉了。)
    #pragma import(__use_no_semihosting)  
    /******************************************************************************  
    *标准库需要的支持函数  
    ******************************************************************************/  
    struct __FILE  
    {  
    int handle;  
    /* Whatever you require here. If the only file you are using is */  
    /* standard output using printf() for debugging, no file handling */  
    /* is required. */  
    };  
    /* FILE is typedef’ d in stdio.h. */  
    FILE __stdout;  

    /// <summary>  
    /// 定义_sys_exit()以避免使用半主机模式  
    /// </summary>  
    /// <param name="x"></param>  
    /// <returns></returns>  
    _sys_exit(int x)  
    {  
    x = x;  
    }  

     

    int fputc(int ch, FILE *f) 

        //USART_SendData(USART1, (u8) ch); 
        USART1->DR = (u8) ch; 
         
        /* Loop until the end of transmission */ 
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
        { 
        } 

        return ch; 

    semihosting的作用,介绍如下 
    Semihosting is a mechanism for ARM targets to communicate input/output requests 
    from application code to a host computer running a debugger. This mechanism could be 
    used, for example, to allow functions in the C library, such as printf() and scanf(), to use the screen and keyboard of the host rather than having a screen and keyboard on the target system. 
    This is useful because development hardware often does not have all the input and 
    output facilities of the final system. Semihosting allows the host computer to provide these facilities. 
    Semihosting is implemented by a set of defined software interrupt (SWI) operations. 
    The application invokes the appropriate SWI and the debug agent then handles the SWI 
    exception. The debug agent provides the required communication with the host. 
    In many cases, the semihosting SWI will be invoked by code within library functions. The application can also invoke the semihosting SWI directly. Refer to the C library descriptions in the ADS Compilers and Libraries Guide for more information on support for semihosting in the ARM C library. 
     按我的理解,这个模式是用来调试的,通过仿真器,使用主机的输入输出代替单片机自己的,也就是说即便单片机没有输出口也能printf到电脑上。反过来,由于这个模式更改了printf()等的实现方式,输入输出就不走单片机的外设了,所以只重定义fputc不起作用。 

    用代码关闭此模式后,需要同时更新一下__stdout 和__stdin 的定义,所以有后面的语句。 

    以上仅为个人理解,如有错误请指正。 


    另外,勾选microlib之后,也许编译的时候就不把开启semihosting的文件包进去了,所以没事。

    C库函数重定向:
    用户能定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数。这个过程叫做重定向C语言库函数,如下图所示。
    举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去了。
    下面是实现fputc()重定向的一个例子:
    externvoidsendchar(char*ch);
    intfputc(intch,FILE*f)
    {/*e.g.writeacharactertoanUART*/
    chartempch=ch;
    sendchar(&tempch);
    returnch;

    这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()假定是个另外定义的串口输出函数。在这里,fputc()就似乎目标硬件和标准C库函数之间的一个抽象层。

    原文出自:http://www.openedv.com/posts/list/3172.htm
    展开全文
  • C/C++输入输出函数——scanf/printf

    千次阅读 2019-02-25 19:17:35
    printf称为格式化输出函数,私认为调整输出的方面比C++中标准输出输出cout函数好用,并且更加高效。 函数原型: int printf(const char * format, [,argument] ); printf函数是一个&amp;quot;可变参数函数&...


    在C++中,scanf函数用于输入,printf函数用于输出,且比cin和cout处理大量数据更加省时。

    1.printf函数

    printf称为格式化输出函数,私认为在调整输出的方面比C++中标准输出输出cout函数好用,并且更加高效。
    函数原型:

    int printf(const char * format, [,argument] );
    

    printf函数是一个"可变参数函数"(即函数参数的个数是可变的)。
    确切的说,是输出参数的个数是可变的,即原型中的[]部分;
    且每一个输出参数的输出格式都有对应的格式说明符与之对应,即格式串format的左端第一个格式说明符对应第一个输出参数,以此类推,也不容易将格式说明符想象成占位符。

    格式说明符的一般形式如下(方括号 [] 中的项为可选项):

    %[flags][width][.prec][length] type_char
    /*用中文标识如下:*/
    %[标志符][宽度][精度][长度]类型符
    
    1.1 类型符(type_char)

    它用以表示输出数据的类型,下表所示:

    符 号 类 型 说 明 示 例 结 果
    % 输出字符“%”本身 printf("%%"); %
    d、i int 以带符号十进制整型输出 printf("%i,%d", 100,100); 100,100
    u unsigned int 以无符号整型输出 printf( “%u,%u”,100u,100); 100,100
    o unsigned int 以八进制无符号整S输出 printf( "%o”,100); 144
    x unsigned int 以十六进制小写输出 printf("%x",11); b
    X unsigned int 以十六制大写输出 printf("%X",11); B
    f float/double 小数形式单、双精度浮点数 printf("%f",3.14159); 3.141590
    e/E float/double 指数形式的单、双精度浮点数 printf("%e",3.14159); 3.141590e+00
    g或G float/double 以%f或%e形式输出浮点数 printf("%g",3.14159); 3.171590
    c char 单个字符 printf("%c %c %c",‘c’,’+’,’+’); c + +
    s string 字符串(字符数组) printf("%s",“welcom to c++”); welcom to c++
    p 地址 输出一个指针 string s = “welcom to c++”; printf("%p",&s); 32/64位的地址数值

    这里注意一个问题:
    在C语言中用%s输出字符数组是可以的,
    但是如果是输出C++中定义的string类型的字符串,则需要先转换成C字符数组
    string str = "hello"; printf("%s",str.c_str());

    1.2 标志符(flags)

    它用于规定输出格式*(对齐方式),如下表所示。

    符号 说 明
    (空白) 右对齐,左边填充 0 和空格
    (空格) 输出值为正时加上空格,为负时加上负号
    - 输出结果为左对齐(默认为右对齐),右边填空格
    + 在数字前增加符号“+”(正号)或“-”(负号)
    # 类型符是o、x、X吋,增加前缀0、0x、0X;
    0 参数的前面用0填充,直到占满指定列宽为止(如果同时存在“-”,将被“-”覆盖,导致 0 被忽略
    1.3 宽度(width)

    它用于控制显示数值的宽度,如下表 所示。

    符号 说 明
    n 至少输出 n 个字符(n 是一个正整数)。否则用空格填满余下的位置
    0n 至少输出 n 个字符(n 是一个正整数)。否则用0满余下的位置
    1.4 精度(.prec)

    它用于控制显示数值的精度
    如果输出的是数字,则表示小数的位数
    如果输出的是字符,则表示输出字符的个数
    若实际位数大于所定义的精度数,则截去超过的部分。
    如下表所示。

    符号 说明
    系统默认精度
    .0 对于 d、i、o、u、x、X等整形类型符,采用系统默认精度;对于f、F、e、E等浮点类型符,不输出小数部分
    .n 1) 对于d、i、o、u、x、X类型符,至少输出 n 位数字,且:少于n位,用0填充;对于n位,不截断。
    .n 2)对于 s 类型符,如果对应的输出串的长度不超过 n 个字符,则将其原样输出,否则输出其头 n 个宁符
    1.5 长度(length)

    它用于控制显示数值的长度,不常用,感兴趣的同学自己了解。

    注意事项:

    • 在调用printf函数时,其参数是从右至左进行处理的,所以尽量不要在 printf 语句中改变输出变量的值
    int k=8;
    printf("%d,%d\n",k,++k);
    /*输出9 9
    可以写成
    printf("%d\n",k);
    printf("%d\n",++k);
    */
    
    • 每一个输出参数的输出格式都必须有对应的格式说明符与之一一对应,并且类型必须匹配。若二者不能够一一对应匹配,则不能够正确输出,而且编译时可能不会报错;
    • 若格式说明符个数少于输出项个数,则多余的输出项将不予输出;
    • 若格式说明符个数多于输出项个数,则可能会输出一些毫无意义的数字乱码。
    1.6 替换符(*)

    有时候,我们需要输出的宽度或者位数是实现不确定的,则我们可以在格式串中引入替代符号*,例如

    printf("%0*d\n", 5, 10);       // 00010
    printf("%.*f\n", 2, 10.12345); // 10.12
    

    若用一个输入的变量来代替*,则我们可以控制输出的宽度。

    2.scanf函数

    scanf 函数的功能与 printf 函数正好相反,执行格式化输入功能。

    • 即 scanf 函数从格式串的最左端开始,每遇到一个字符便将其与下一个输入字符进行“匹配”,如果二者匹配(相同)则继续,否则结束对后面输入的处理;
    • 而每遇到一个格式说明符,便按该格式说明符所描述的格式对其后的输入值进行转换,然后将其存于与其对应的输入地址中。以此类推,直到格式串结束为止。

    函数原型:

    int scanf(const char *format[,argument]);
    

    同 printf 函数相似,scanf 函数也是一个“可变参数函数”。
    同时,scanf 函数的第一个参数 format 也必须是一个格式化串
    除此格式化串之外,scanf 函数还可以有若干个输入地址,且对于每一个输入地址,在格式串中都必须有一个格式说明符与之一一对应。即从格式串的左端第 1 个格式说明符对应第 1 个输入地址,以此类推。

    注意:
    argument表示参数的地址!要加“&”!

    格式说明符(format)的一般形式:

    %[*][width][length] type_char
    /*用中文标识如下:*/
    %[*][宽度][长度]类型符
    
    2.1 类型符(type_char)

    1.1类似

    格式字符 含义
    d或i 带符号十进制整数
    o 无符号八进制数
    x或X 无符号十六进制数
    u 无符号十进制整数
    f、e、E、g、G 浮点数
    c 单个字符
    s 字符串
    2.2 修饰符说明
    修饰符 说明
    * 跳过读入数据,不存入对应的argument中
    width 指定输入数据所占用的宽度
    modifiers 指定由d、i、x、X、o、u、e、f、g说明的字符的大小

    3.注意事项

    3.1 自增自减

    尽量不要在printf()时,使用自增,自减符,除非你知道printf()对于参数的计算顺序是从优到左,而且对于所有编译器,下面代码的结果不一定相同。

    int x;
    x = 1; printf("%d %d\n", x, x++);
    x = 1; printf("%d %d\n", x++, x);
    x = 1; printf("%d %d %d\n", x, x++, x);
    x = 1; printf("%d %d %d %d\n", x, ++x, x++, x);
    
    展开全文
  • 源代码经常会出现下面一些错误处理函数。 一、errno 头文件:#include <errno.h> 函数原型:errno 功能:记录系统的最后一次错误代码 参数:无 返回值:错误代号(整型值) 例子: 1 2 3 ...

    在源代码中经常会出现下面一些错误处理函数。

    一、errno

    头文件:#include <errno.h>

    函数原型:errno

    功能:记录系统的最后一次错误代码

    参数:无

    返回值:错误代号(整型值)

    例子

    1
    2
    3
    4
    5
      if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
            fprintf(stderr, "errno = %d \n", errno);
            exit(1);
        }
    printf("Socket opened successfully \n");
    //errno 返回整型错误代号。

    二、strerror   strerror_r

    头文件:#include <string.h>

    函数原型

    char *strerror(int errnum);

    char *_strerror(const char *strErrMsg);

    wchar_t * _wcserror(int errnum);

    wchar_t * __wcserror(const wchar_t *strErrMsg);

    参数:errnum——错误代码,strErrMsg——用户提供的信息。

    返回值:指向错误信息的指针。

    1
    2
    3
    4
    5
          if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
            fprintf(stderr, "errno = %d \n", errno);
            fprintf(stderr, "Error description is : %s\n",strerror(errno));
            exit(1);
        } 
        //strerror(errno)返回指向errno对应的错误信息的指针,即第三个fprintf输出的是错误信息描述。

    三、perror

    头文件

    #include<stdio.h>  

    #include<stdlib.h>

    函数原型

    void perror(const char *s);

    perror ("open_port");

    函数功能

    perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。

    在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。

    参数:用户输入的字符串

    返回值:无

    例子

    1
    2
    3
    4
    5
    6
    7
    8
          if(( sockfd = socket(AF_INET,SOCK_DGRAM,0))<0)
        {
            perror("myError");
            exit(1);
        } else 
        {
            printf("socket created successfully!\n");
        }
        //先打印出字符串myError(即perror的参数),再打印errno对应的错误信息。
        //打印到标准设备上,stderr即对应终端的屏幕。

    四、fprintf和printf

    #include <stdio.h>

     

    int fprintf(FILE *stream,const char *format,…);

    根据format格式发送参数到stream流。

     

    int printf(const char *format,…);

    通过标准输出设备输出一组数据。

    转载于:https://www.cnblogs.com/helloweworld/archive/2012/09/11/2680691.html

    展开全文
  • 标准C_02标准函数

    2019-04-20 21:08:38
    例如:Printf标准函数可以把程序的数字打印终端窗口里 为了使用这个标准函数需要包含stdio.h的头文件,可以双引号里使用占位符把数字转移到双引号的后面。 打印之前计算机会用双引号后面的数字依次替...
  • Python程序导入ctypes模块,载入动态链接库。动态链接库有三种:cdll以及windows下的windll和oledll,cdll载入导出函数...使用cdll.msvcrt即可调用MS标准的C库msvcrt,msvcrt包含了大部分标准C函数。 下面来看一下
  • STM32中printf函数

    千次阅读 2013-12-18 14:18:35
    标准库函数的默认输出设备是显示器,要实现串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:#ifdef __GNUC__  #...
  • C标准printf函数就是如此。 某些时候,比如做嵌入式设备,我们自己开发一套打印调试数据的接口(比如通过UART或USB),如果自己完全根据printf中的数据格式来写比较浪费时间和资源。幸亏C语言标准库...
  • c&&C++】 printf函数

    2013-12-06 15:21:00
    printf函数是一个标准库函数,它的函数原型头文件“stdio.h”printf函数调用的一般形式为:printf(“格式控制字符串”, 输出表列)其中格式控制字符串用于指定输出格式。格式控制串可由格...
  • Python调用ctypes使用C函数printf的方法Python程序导入ctypes模块,载入动态链接库。动态链接库有三种:cdll以及windows下的windll和oledll,cdll载入导出函数使用标准的cdecl调用规范的库,而windll载入导出...
  • 动态链接库有三种:cdll以及windows下的windll和oledll,cdll载入导出函数使用标准的cdecl调用规范的库,而windll载入导出函数符合stdcall调用规范(Win32 API的原生约定)的库,oledll也使用stdcall调用规范,并假设...
  • 动态链接库有三种:cdll以及windows下的windll和oledll,cdll载入导出函数使用标准的cdecl调用规范的库,而windll载入导出函数符合stdcall调用规范(Win32API的原生约定)的库,oledll也使用stdcall调用规范,并假设...
  • 通过函数原型可以看出printf函数其实是一个可变参数函数在printf函数中只需要知道传入函数的第一个参数,就可以根据该参数的存储位置获取后面参数的位置及信息了。 printf函数第一个参数const cahr *format...
  • 转载地址:http://bbs.ednchina.com/BLOG_ARTICLE_3017403.HTM标准库函数的默认输出设备是显示器,要实现串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.例如:printf输出到串口,需要将fputc...
  • Python调用ctypes使用C函数printf

    千次阅读 2012-09-19 16:01:31
    动态链接库有三种:cdll以及windows下的windll和oledll,cdll载入导出函数使用标准的cdecl调用规范的库,而windll载入导出函数符合stdcall调用规范(Win32 API的原生约定)的库,oledll也使用stdcall调用规范,并假设...
  • C++scanf和printf系列函数简介

    千次阅读 2018-06-12 14:32:11
    C++,scanf系列函数用于输入,printf系列函数用于输出。1 scanf系列函数常用的scanf系列函数包括scanf()、sscanf()和fscanf()。1.1 scanf()函数scanf()函数标准输入流stdin读取数据,并且将数据写入到指定...
  • printf函数的基本用法

    千次阅读 2016-04-12 22:12:03
    加上对C中的输出不太了解,故特此整理printf函数的用法。 printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。 printf...
  • printf函数输出变量

    千次阅读 2017-05-06 17:13:02
    Printf()函数是一个标准函数,它的函数原型头文件“stdio.h”,该函数的使用方法如下所示。 printf("格式控制字符串",输出变量列表) 格式字符串的内容和意义如下所示。 %c : 输出单个字符,参数为该字符的...
  • C中printf是一个标准的输出函数。  C++中的cout是iostrem文件中定义的全局对象   联系: 完成的功能一样,都是输出。   区别: 1.书写格式不一样 eg: int a=6; cout 2.printf需要你告诉它格式(int...
  • printf()函数是格式输出函数,请求printf()打印变量的指令取决与变量的类型.例如,打印整数是使用%d符号,打印字符是用%c 符号.这些符号被称为转换说明.因为它们指定了如何不数据转换成可显示的形式.下列...
  • 动态链接库有三种:cdll以及windows下的windll和oledll,cdll载入导出函数使用标准的cdecl调用规范的库,而windll载入导出函数符合stdcall调用规范(Win32 API的原生约定)的库,oledll也使用stdcall调用规范,并假设...
  • 在c/c++标准,变参函数很特别。printf, fprintf, sprintf等都属于变参函数。如果自己要写类似的参数可变的函数,通常会用到下面三个函数: #include <stdarg.h> void va_start...
  • keil标准Cprintf、scanf等输入输出数据流函数是通过fputc、fgetc来实现最底层操作的,所以我们只需要我们的工程重定义这两个函数的功能就可以实现printf、scanf等数据流函数的重映射。因此看到通过...
  • printf()函数是格式化...printf函数在标准库的 stdio.h 定义,用于C、C++语言产生格式化输出,用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明(例如%d,%s等)组成,可以输出...
  • 中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt、#program interrupt等。当一个函数被...
  • 第1步:main.c中包含"stdio.h” (标准输入输出头文件); 第2步:main.c文件中重定义fput()这个C标准库函数(因为printf()C标准库函数中实质上是一个宏,要调用到fputc()这个函数);

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 545
精华内容 218
关键字:

在标准c中在函数printf