精华内容
下载资源
问答
  • 全部展开输出变量的方法与输出变量printf(“ sum =%d / n”,sum)的方法相似;表示输出总和,只需将输出总和和sum1更改为printf(“ sum =%d,Sum1 =%d / n”,sum,sum1);. %D表示输出格式是带小数点的...

    7b33969c57870af5870051145235df6d.png

    全部展开

    输出两个变量的方法与输出一个变量printf(“ sum =%d / n”,sum)的方法相似;表示输出总和,只需将输出总和和sum1更改为printf(“ sum =%d,Sum1 =%d / n”,sum,sum1);. %D表示输出格式是带小数点的整数.

    e44771236bd63bffecf7357fd0e30662.png

    printf()函数的格式为: printf(“ ”,);

    格式字符串包括两部分: 一个是普通字符,这些字符将照原样输出;另一种是格式化指定字符,以“%”开头,然后是一个或多个指定字符,用于确定输出内容格式. 参数表是需要输出的一系列参数. 该数字必须与格式字符串指定的输出相同.

    c060bebcdb31b957bc7bac561e95e90f.png

    887fdcca23f1aadc3bc3aff3cce92692.png

    扩展信息

    1485224764140_2.jpg

    有关在C语言中输出printf的说明:

    1. 使用printf输出宽字符时,需要使用setlocale来指定本地化信息并指定当前代码的编码方法. 除了使用%S外,您还可以使用%ls.

    fd8e22f176b45822bbd7b52bc9f1b084.png

    2,%a和%A是C99引入的格式类型,它们使用十六进制p表示法输出浮点数. 该表示法类似于E科学表示法,但有所不同. 该数字以0x开头,然后是十六进制浮点部分printf输出数字,然后是p后的以2为底的顺序代码.

    3. 除了指示输出的数据类型之外,格式控制字符串还可以按顺序包含其他一些可选的格式描述,包括标志,宽度printf输出数字,.precision和length.

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/ruanjian/article-157235-1.html

    展开全文
  • printf输出之奇怪数据

    2018-02-12 14:37:28
    printf输出数据在内存中的读取顺序? 要点 赋值号有数据类型转换的作用;printf不带类型转换,且解析数据类型失败时打印0。 截图展示区 Code1: #include int main(void) { float a = 2.5; int b = 2; printf(...

    研究问题

    1. printf输出时数据在内存中的读取顺序?

    要点

    1. 赋值号有数据类型转换的作用;printf不带类型转换,且解析数据类型失败时打印0。

    截图展示区

    1. Code1:
    #include <stdio.h>
    int main(void)
    {
        float a = 2.5;
        int b = 2;
        printf("%d\n%f\n%d\n%f\n", a, a, b, b);    
        putchar('\n');
        printf("%f\n%d\n%f\n%d\n", a, a, b, b);    
        return(0);
    }

    分析:

    32位编译器下:sizeof(int) 是 4, sizeof(double) 是 8

      (int)a_>|       |4byte
              |__2.5__|4
    (float)a_>|       |4
      (int)b_>|__2.5__|4
              |___2___|4
    (float)b_>|___2___|4

      第一个 %d 读到的实际是 2.5 的前 4 byte。 紧接着第一个 %f 读的是 2.5 的后 4 byte, 加上下一个 2.5 的前 4 byte. 同理,第二个 %d 读到的是 2.5 的后 4 byte, 而第二个 %f 读到的是两个 2。

      prinft依赖于vsprintf,而vsprintf的实现依赖这几个宏,它会根据格式字符串(也就是那些%d %f …)来调用va_arg,如果你的格式字符串和你后面的不定参数没有正确对应起来,那么也有可能在获取不定参数时出现错位。
    还有float(32位)参数在传递printf的时候会自动转换成double(64位)(这也是%f和%lf没区别的缘故),int参数占32位。
    注:以下连续的十六进制数据从左到右对应于内存地址的由低到高。

      你传入的参数a,a,b,b,对应十六进制的00 00 00 00 00 00 04 40 00 00 00 00 00 00 04 40 02 00 00 00 02 00 00 00正确的分割应该是:
    a: [00 00 00 00 00 00 04 40]
    a: [00 00 00 00 00 00 04 40]
    b: [02 00 00 00]
    b: [02 00 00 00]

      根据你的第一次输出的格式字符串,printf做了如下的分割:
    %d: [00 00 00 00] int,对应0x00000000,也就是0了
    %f: [00 00 04 40 00 00 00 00] double,0.0,(看double的表示法)
    %d: [00 00 04 40] int,对应0x40040000,也就是10进制的1074003968
    %f: [02 00 00 00 02 00 00 00] double,0.0
    所以输出也就是:
    0
    0.000000
    1074003968
    0.000000
      而根据你第二次输出的格式字符串,printf做了如下的分割:
    %f: [00 00 00 00 00 00 04 40] double, 对应2.5
    %d: [00 00 00 00] int 对应0
    %f: [00 00 04 40 02 00 00 00] double,对应0
    %d:[02 00 00 00] int 对应0
    也就是你看到的:
    2.500000
    0
    0.000000
    2

    至于为什么好几次double都变成0.0,你需要去看看IEEE的double表示标准。

    简而言之就是:printf的在做输出的时候会根据格式字符串来获取传递进来的不定参数,而错误的格式字符串会导致不定参数的获取错误,从而导致输出错误。

    来自 https://segmentfault.com/q/1010000002534752

    1. Code2:
    #include<stdio.h>
    void main()
    {
        printf("%d,%d\n",10.9,10);
        printf("%d\n", 10.9);
        printf("%d\n", 10);
        getchar();
    }

    分析:

    栈一(第一行printf):
       (int)_>|       |4byte
       (int)_>|__10.9_|4
              |___10__|4
    
    栈二(第二行printf):
       (int)_>|       |4
              |__10.9_|4
    
    栈三(第三行printf):
       (int)_>|__10___|4
    
    展开全文
  • 如何实现多个串口重定义实现printf输出,在STM32中 c语言可变参数输出

    目录

    工程代码:

    代码分析:


    如何实现多个串口重定义实现printf输出,在STM32中?

    工程代码:

    #include "stdarg.h"		//包含需要的头文件 
    
    #define USART1_TXBUFF_SIZE   256    //定义串口3发送缓冲区大小 256字节
    
    __align(8) char Usart3_TxBuff[USART1_TXBUFF_SIZE];//串口3缓存区
    
    #if 1
    //串口1
    int fputc(int ch, FILE *s)
    {
        /* 阻塞判断串口是否发送完成 */
        while((USART1->ISR & 0X40) == 0);
    
        /* 串口发送完成,将该字符发送 */
        USART1->TDR = (uint8_t) ch;
    
        return ch;
    }
    #endif
    
    //串口3,AT指令发送端口,操作wifi
    
    void u3_printf(char* fmt,...) 
    {  
    	unsigned int i,length;
    	
    	va_list ap;
    	
    	//va_list 可变参数列表,存参数地址
    	va_start(ap,fmt);//获取可变参数地址 fmt地址赋给ap
    	
    	vsprintf(Usart3_TxBuff,fmt,ap);/*使用参数列表发送格式化输出到字符串,
    	函数功能将可变参数格式化输出到一个字符数组
    	*/
    	//fmt中内容赋给Usart3_TxBuff,
    	va_end(ap);	//清空参数列表
    	//
    	
    	length=strlen((const char*)Usart3_TxBuff);		
    	while((USART3->ISR&0X40)==0);
    	for(i = 0;i < length;i ++)
    	{			
    		USART3->TDR = Usart3_TxBuff[i];
    		while((USART3->ISR&0X40)==0);	
    	}	
    }

    代码分析:

    可变参数:c语言可变参数输出

            va_list ap;
    	
    	//va_list 可变参数列表,存参数地址
    	va_start(ap,fmt);//获取可变参数地址 fmt地址赋给ap
    	
    	vsprintf(Usart3_TxBuff,fmt,ap);/*使用参数列表发送格式化输出到字符串,
    	函数功能将可变参数格式化输出到一个字符数组
    	*/
    	//fmt中内容赋给Usart3_TxBuff,
    	va_end(ap);	//清空参数列表

    把可变参数地址存到ap中,存储图如下。 

    函数形式参数存储:

    void func(char * parameter0,char * parameter1,char * parameter2,char * parameter3){
    }

    栈向下生长,先入后出。 

    展开全文
  • (2)printf输出前置加加 (3)printf输出后置加加 (4)printf输出printf (1)前置加加和后置加加的区别 首先我们先来了解一下前置加加和后置加加的区别。 前置加加在编译器里的操作 //++a int a = 0; a = ...

    目录

    (1)前置加加和后置加加的区别

    (2)printf输出前置加加

    (3)printf输出后置加加

    (4)printf输出printf


    (1)前置加加和后置加加的区别

    首先我们先来了解一下前置加加和后置加加的区别。

    前置加加在编译器里的操作

    //++a
    int a = 0;
    a = a + 1;
    return a;

    前置加加是先加一,后赋值,返回的值是加一之后的值。

    后置加加在编译器里的操作

    //a++
    
    int a = 0;
    tmp = a;
    a = a + 1;
    return tmp;

     后置加加是先把值赋给临时量,然后再加一,返回的值是临时量的值。

    前置加加可以做左值,因为前置加加返回的是a的值,是可以进行操作的,后置加加则不可以,因为后置加加返回的是一个临时量,并不是程序中定义的可寻址变量,不能通过地址对temp进行操作。


    (2)printf输出前置加加

    #include<stdio.h>
    
    int main()
    {
    	int i = 1;
    	printf("%d,%d\n",++i,++i);
        return 0;
    }

    printf函数计算参数的时候是从右往左压栈的。目的是为了计算参数的个数。编译器首先从右往左计算各参数的值,再进行压栈操作,最右端的"++i"的值是计算出来是2,保存在eax寄存器中,接着计算倒数第二个"++i"的值,给eax寄存器加一,保存为3,然后进行压栈,把eax寄存器里的i的地址放入栈中,此时输出的值是i的值,所以都是3.


    (3)printf输出后置加加

    #include<stdio.h>
    
    int main()
    {
    	int i = 1;
    	printf("%d,%d\n",i++,i++);
        return 0;
    }

    最右端的"i++"的值为1,保存在临时量里,计算出i的值为2,倒数第二个"i++"的值为2,i的值为3,"i++"也保存在对应的临时量里,但是两个临时量保存的地址是不同的,进行压栈操作,压入的是保存两个临时量的地址,所以输出的是2和1.

    汇编指令:


    (4)printf输出printf

    #include<stdio.h>
    
    int main()
    {
    	int i = 33;
    	printf("%d\n",printf("%d ",printf("%d ",i)));
        return 0;
    }

    首先输出的第一个"33"是"i"的值,第二个"%d"算出来的是"33"的值的字节大小,占两个字节,还有空格的字节长度,一共是三个字节,所以输出的是"3",第三个"%d"算出来的是"3"的值的字节大小,占一个字节,还有空格的字节长度,一共是两个字节,所以输出的是2。

    展开全文
  • printf输出

    千次阅读 2012-08-20 14:47:39
    (一)使用printf输出各种格式的字符串 1. 原样输出字符串:  printf(“%s”, str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:  printf(“%Ns”, str); –N 为指定长度的10进制数值 3. 输出指定...
  • 有关printf多个输出时的输出问题

    千次阅读 2020-10-13 19:31:57
    查了一圈,发现了第一问题,printf的计算顺序是从右往左的(和栈有关,先入后出),于是再次计算,发现还是不对,第二次算出为“4 2”。所有又是哪里出问题了呢。 忽然想起,vs有反汇编的功能,那我直接看汇编代码...
  • C语言 printf输出字符串数据

    千次阅读 2017-08-02 15:46:28
    void main() { unsigned char *x = "ab,sdf,sad,23432,cc"; data = x; printf("data = %c\n", *data); printf("data = %s\n", data);... system("pause");...输出结果为 data = a data = ab,sdf,sad,23432,cc
  • 一般情况下,应用程序采用的字符集为gbk, gb2312,该字符集中一个汉字由两个字节组成,所以在普通的C语言...输出多个中文:printf("%s\n", p ); //按字符串输出完整的数据输出一个中文:printf("%c%c", *p, *p+1 );...
  • printf输出 STL string数据类型

    千次阅读 2009-12-04 13:47:00
    printf输出 STL string类型数据总结一.例子#include #include using namespace std;int main(){ string a; a[0]=a; a[1]=/0; printf("%s/n",a); system("pause");}出错: [Warning] cannot pass objects of
  • printf 输出格式

    千次阅读 2015-04-13 15:25:19
    (一)使用printf输出各种格式的字符串 1. 原样输出字符串:  printf(“%s”, str); 2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:  printf(“%Ns”, str); –N 为指定长度的10进制数值 3. 输出指定...
  • printf输出多列时的列对齐

    千次阅读 2017-06-09 12:59:29
    表示输出字符串左对齐输出20,如果字符串不够20,以空格补齐。 -表示左对齐。 例: struct help_struct { char *option_name; char *option_value; char *option_ext; }; struct help_s
  • c语言printf输出语句A printf() function is a standard library function, that is used to print the text and value on the standard output screen. Here, we will evaluate the expression – where a printf()...
  • printf输出格式

    千次阅读 2019-08-08 08:05:57
    format-- 是字符串,包含了要被写入到标准输出 stdout 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化 printf的格式控制字符串format组成如下: %[flags]...
  • C printf输出格式控制

    2019-02-17 16:59:10
    在C语言程序中,几乎没有一程序不需要这两函数,尤其是输出函数(printf),所以这两函数必须要掌握。 如果在程序中要使用 printf 或者 scanf,那么就必须要包含头文件 stdio.h。因为这两...
  • shell中printf输出

    2020-06-22 17:12:44
    printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。 printf 控制格式的字符...
  • printf 标准输出

    2017-12-19 20:25:48
    printf输出类型输出格式’ 输出内容输出类型 %ns 输出字符串。n 是数字,代指输出字符。 %ni 输出整数。n 是数字,代指输出数字。 %m.nf 输出浮点数。m 和 n 是数字,代指输出的整个数字位数和小数位数。...
  • 指定printf输出域宽

    万次阅读 多人点赞 2016-04-14 09:31:44
     每有用的C程序中都用到了printf函数,它可以根据我们指定的格式符来输出数据。很初学者只关心%d,%f,%c等格式符,却忽略了格式修饰符的使用。事实上,合理地使用格式修饰符会给输出带来很方便。本文只讨论...
  • 输出结果是:8 7而不是9,7 这并不违背分割新上面关于printf函数从右向左计算的原因。 总结:到这里,要掌握的是两点, 一是:printf函数中的计算是从右向左进行的。 二是:我们在写代码时,应该尽量避免...
  • printf输出死机

    千次阅读 2018-05-08 10:41:51
    今天老大给安排了任务,查死机BUG 这正是我喜欢的事情,于是二话不说投入200%的精力,开始查。话说此BUG 必先,一般来讲,毕现不是BUG,可是这BUG却把我折腾的够呛,查了两小时从有根据变成了没根据此BUG崩溃...
  • C语言printf函数参数多个“”

    千次阅读 2019-08-20 17:47:10
    今天在看代码的时候看到了这样写的一个printf函数 printf( "aaaa" "bbbb" "cccc" "dddd" ); 在C的标准库-------<stdio.h> C 库函数 int printf(const char *format, …) 发送格式化输出到标准输出 ...
  • Printf中的行缓冲以及让printf输出

    千次阅读 2016-07-16 09:59:04
    也就是说在内存空间中预留了一定的存储空间这些存储空间用来缓冲输入或输出数据这部 分预留的空间就叫做缓冲区。 缓冲区根据其对应的是输入设备还是输出设备分为输入缓冲区和输出缓冲区。 2、引入缓冲区的原因:...
  • 基础的东西总是很容易忘,要...格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。 格式字符串 1) 类型 类型字符用以表示输出数据的类型,其格式符和意义...
  • printf输出不及时

    2013-12-10 18:19:56
    在linux系统下,printf函数是行缓冲式的输出,当printf遇到\n时,或者缓冲区满时,才会将缓冲区里的内容刷新到标准输出(stdout). 因此, printf("p"); 等语句的显示不能立刻显示在屏幕上,但是printf("p\n"); 可以. ...
  • 在codeblocks中,利用printf函数输出double数据时,输出结果始终为0.000。 运行时输出函数代码如下: printf("%.2lf\n", answer); 2.解决办法 在C++中,double类型需用 %f 格式输出,不能用%lf格式输出。正确代码...
  • C语言 printf数据输出小数转换

    千次阅读 2020-01-31 22:58:58
    使用printf输出小数 标准模板为 % [标志] [数字] .[数字].[类型] 类型为数字的数据类型 比如 int float double等 标志 包括 -+空格 # ;分别表示 左对齐 右对齐 ,空格表示;输出数据为正时带空格 ,输出数据为负时...
  • printf输出格式总结

    千次阅读 2015-03-17 16:32:21
    width为参数的最小长度,若此栏并非数值,而是*符号,则表示以下一个参数当做参数长度。 flags 有下列几种情况 #NAME? + 一般在打印负数时,printf()会加印一负号,整数则不加任何负号。此旗标会使得在...
  • C语言随笔_printf输出多行

    千次阅读 2019-09-15 01:08:10
    想在printf中,输出多行数据,如果写成下面这样: printf("line 1\n line 2\n line 3\n"); 编译器会报错“error C2001: newline in constant”。 可以这样写: printf("line 1\ line 2\ line 3\n...
  • C++学习笔记之 printf输出字符串

    千次阅读 2018-10-12 11:26:16
    printf输出字符串 leetcode的练习14——最长公共前缀,遇到打印字符串的问题 string ss = { "\0" }; Solution sol1; ss=sol1.longestCommonPrefix(s1); printf("%s\n", &amp;ss); ss是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 373,530
精华内容 149,412
关键字:

printf输出多个数据