精华内容
下载资源
问答
  • #include<stdio.h> int main() { char c; scanf("%c",&c); while(c!='#') { if(c>... printf("%c",c);...输出hkSDhkSDhkSDhkSDhkSDhkSDhkSDhkSDhkSDhkSDhkSDhkSDhkSDhkSD....很多
  • 在main函数中使用了printf 函数,但是不能输出变量的结果: int g_bootdelay = 3;  int main (void) {    shell_init();// 所有初始化(包括绑定中断、使能中断等)    // 自动倒数执行默认命令  // ...

    在学习嵌入式程序时,编写一个倒计数自启动命令的过程中,使用了wdt定时器中断isr_wdt,由于原来编写的程序bin大于16KB,故分成了BL1和BL2两部分代码,IRQ_handle:部分的代码放在了BL2的start.S的尾部。代码如下:

    #define WTCON        0xE2700000

    #define SVC_STACK    0xd0037d80    //ARM的栈是满减栈,所以从高位地址开始
    #define IRQ_STACK   0XD0037f80    //ARM的栈是满减栈,所以从高位地址开始

    .global _start                    // 把_start链接属性改为外部,这样其他文件就可以看见_start了
    .global IRQ_handle
    _start:
        // 第1步:关看门狗(向WTCON的bit5写入0即可)
        ldr r0, =WTCON
        ldr r1, =0x0
        str r1, [r0]
        
        // 第2步:初始化时钟
        bl clock_init
        
        // 第3步:设置SVC栈
        ldr sp, =SVC_STACK
        
        // 第4步:开/关icache
        mrc p15,0,r0,c1,c0,0;            // 读出cp15的c1到r0中
        //bic r0, r0, #(1<<12)            // bit12 置0  关icache
        orr r0, r0, #(1<<12)            // bit12 置1  开icache
        mcr p15,0,r0,c1,c0,0;

        
        bl main
        
        
        // 从这里之后就可以开始调用C程序了
        //bl led_blink                    // led_blink是C语言实现的一个函数
        
    // 汇编最后的这个死循环不能丢
        b .
        

        
        
        
        //在这个汇编函数中,用来做中断irq模式下的现场保护和恢复,并且调用真正的中断处理程序    
    IRQ_handle:
        //设置IRQ下的栈
        ldr sp, =IRQ_STACK
        //保存LR(暂存返回地址的)

        //因为有流水线,在中断来临时(此时地址为a),返回地址应该是在当前指令的下一条指令地址为a+4,
        //但是PC此时指向的是返回地址(地址为a+4)的下一条指令(此时地址为a+8),
        //所以PC的值会比真正的执行的代码地址(地址为a)多8个字节,这就是流水线的效果。
        sub lr, lr, #4


        //保存r0~r12和lr到irq模式下的栈里面去
        stmfd sp!, {r0-r12, lr}
        
        //接着调用真正的中断处理程序isr的函数(此函数在int.c中的void irq_handler(void))来处理中断,
        bl irq_handler
        
        //上面的中断处理完成后,接着来恢复处理现场,其实就是做中断返回,关键是将r0-r12, pc, cpsr一起恢复

        ldmfd sp!, {r0-r12, pc}^

     

     

    在main函数中使用了printf 函数,但是不能输出变量的结果:

    int g_bootdelay = 3;    
    int main(void)
    {
        
        shell_init();//所有初始化(包括绑定中断、使能中断等)
        
        // 自动倒数执行默认命令
        // 在这里等待用户按按键,如果没按就倒计时,如果按了就结束倒计时和自动执行直接
        // 进入shell死循环。如果一直没按按键时间到了也进入shell死循环
        puts("aston#");
        printf("%d", g_bootdelay);   //此句不能输出3,输出只是一个%.
    /*
        while ((!g_isgo) && (!is_key_press()));
        //while (!((g_isgo) || (is_key_press())));
        
        intc_disable(NUM_WDT);
        // 也可以在这里通过判断g_isgo的值来判断是不是倒数结束,执行自动命令
        if (g_isgo)
        {
            lcd_test();
        }

        // 执行shell死循环
        shell_loop();
        
    */    
        //while(1)
            
        return 0;
    }


    // wdt的中断处理程序
    void isr_wdt(void)
    {
        static int i = 0;
        // 看门狗定时器时间到了时候应该做的有意义的事情
        printf("wdt interrupt, i = %d...\n", i++);  //此句也不能输出,输出结果是:%
        // 计时,然后时间没到的时候在屏幕上打印倒数计数,时间到了自动执行命令
        // 执行完命令进入shell的死循环
        //puts("aston#");
        //g_bootdelay--;
        //putchar('\b');
        printf("%d", g_bootdelay);    //此句也不能输出,输出结果是:%
    /*
        if (g_bootdelay == 0)
        {
            g_isgo = 1;
            
            // 把要自动执行的命令添加到这里,但是这里是中断处理程序,不适合执行长代码
            // 所以放在外面要好一些
            
            //printf("g_isgo = 1.\n");
            // 关闭wdt
            //intc_disable(NUM_WDT);
        }
    */
        // 清中断
        intc_clearvectaddr();
        rWTCLRINT = 1;
    }

    为什么在没有分成BL1和BL2的情况下,也在使用此中断函数 isr_wdt()的里面和main函数里使用printf函数时输出结果正常,而当在有BL1和BL2的情况下,也使用此中断isr_wdt的里面和main函数里使用printf函数时输出结果就不正常呢?出现不正常的结果是不是BL1和BL2的内容没有调整对(IRQ_handle:是不是放在BL1的start.S中的尾部?),网上好多帖子说中断里不能使用printf函数,但是我的分成BL1和BL2的时候程序中,中断里使用printf函数都正常着呢?

    哪位朋友给予指点!不胜感激!

     

     


     

    展开全文
  • 来源:为什么printf不能用%lf输出double型,而用%f? printf("%lf",a); 今天看到一篇好文章,mark一下。 出去旅游了一下,所以有些天没敲代码,于是又弱爆了~忘掉了题目中的东西,结果出现了问题,好难找哈~ 死...

    来源:为什么printf不能用%lf输出double型,而用%f?

    printf("%lf",a);

    今天看到一篇好文章,mark一下。

    出去旅游了一下,所以有些天没敲代码,于是又弱爆了~忘掉了题目中的东西,结果出现了问题,好难找哈~

    死记硬背是很难记住一些东西的,只有理解原理才记得深入!奋斗

     

     

    注意scanf函数和printf函数是不同寻常的函数,因为它们都没有将函数的参数限制为固定数量。scanf函数和printf函数又可变长度的参数列表。当调用带可变长度参数列表的函数时,编译器会安排float参数自动转换成为double类型,其结果是printf函数无法区分float型和double型的参数。因此在printf函数调用中%f既可以表示float型又表示double型的参数。

          另一方面,scanf函数是通过指针指向变量的。%f告诉scanf函数在所传地址位置上存储一个float型值,而%lf告诉scanf函数在所传地址位置上存储一个double型值。这里float和double的区别是非常重用的。如果给出了错误的转换说明,那么scanf函数将可能存储错误的字节数量(没有提到的是,float型的为模式可能不同于double型的位模式)。

           另外历史原因C语言中浮点计算一直采用双精度的形式。

           附录说明:IEEE浮点标准的两种主要的浮点数格式:单精度(32位)和双精度(64位)。数值以科学计数法的形式存储,每一个数都是由3部分组成:符号、指数和小数。

                               EEE754浮点标准
    EEE754标准在表示浮点数时,每个浮点数均由三部分组成:符号位S,指数部分E和尾数部分M。

    我们知道10进制数的科学计数法如A= -3.5×105 

    这里最前面有一个负号,3.5是尾数,两个有效数字,后面以10为基数的指数为5。
    我们可以将它表示为 -3.5E5 

    同样,二进制数也可以用科学计数法规格化表示,比如5这个数,如果用二进制表示的话,整型为101,如果用科学计数法则可以表示为 1.25×24 ,这里用的是十进制,将尾数换成二进制就是1.01(就是101向前移两位小数点,和十进制完全相同),后面的指数4换成二进制则是10,那我们将其用二进制的科学计数法就可以写成1.01E10。

    当我们依照这种计数法给一个数字确定其精度(有效位)后,就可以用一定长度的1和0的位串来表示一个实数了。 

    浮点数一般采用以下四种基本格式:

    (1)单精度格式(32位):除去符号位1位后,E占8位,M占23位。

    (2)扩展单精度格式:E>=11位,M31位。

    (3)双精度格式:(64位);E=11位,M=52位。

    (4)扩展双精度格式:E>=15位,M>63位。

    我们最重要的是掌握单精度格式的表示法。在IEEE754标准中,约定小数点左边隐含有一位,通常这位数就是1,这样实际上使尾数的有效位数为24位,即尾数为1.M。指数的值在这里称为阶码,为了表示指数的正负,所以阶码部分采用移码表示,移码值为127,阶码值即从1到254变为-126至+127,在 IEEE754中所有的数字位都得到了使用,明确地表示了无穷大和0,并且还引进了"非规格化数",使得绝对值较小的数得到更准确表示。请看下表:

    S(1位)      E(8位)             M(23位)             N(32位)  
    符             0                 0            (-1)S·2E-127·(1.M) 为规格化数                                     
                  0              不等于0       (-1)S·2-126·(0.M) 为非规格化数
    号        1到254之间          不等于0       (-1)S·2E-127·(1.M) 为规格化数
                 255             不等于0     NaN(非数值) 
    位            255                 0            无穷大  

    其中红色字0、1表示隐含位,注意当数字N为非规格化数或是0时,隐含位是0。

    记住了上面的表格就能算出所有IEEE标准的单精度二进制浮点数了,我们重点要会计算规格化数字的双向转换,并且理解二进制浮点数表示法的思想。

    展开全文
  • printf("字符串的长度%d\n",sizeof(a)-1); } void main() { char a[] = { 'a','b','c','d','e' ,'g','\0'}; char b[] = { 'b','c','d','h' ,'\0'}; length(a); length(b); while (1) { } ...
  • Java悬赏提问,printf和println函数为什么不能输出中文了?是不是eclips的问题
  • 对于标准输出,需要输出的数据并是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。 ANSI C中定义换行符'\n'可以认为是行刷新标志。所以...

    转载请注明出处:http://blog.csdn.net/qq_26093511/article/details/53255970

    原因:  输出缓冲区的问题.

    unix上标准输入输出都是带有缓存的,一般是行缓存。

    对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。

    ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数没有带'\n'是不会自动刷新输出流,直至缓存被填满。


    解决方案:

    方案1、在printf里加"\n"

    方案2、fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上 。


      fflush(stdout); //  刷新一下缓冲区 让它马上输出.  在printf 之后调用它,就会马上输出了.  
      setvbuf(stdout,NULL,_IONBF,0); //如果你嫌上个方法麻烦, 就使用这个函数. 直接将缓冲区禁止了. 它就直接输出了。

    这两个函数都是有关流缓冲区的. 具体使用和说明网上有很多.   我只说一下什么是流缓冲区, 是做什么用的。

      操作系统为减少 IO操作 所以设置了缓冲区.  等缓冲区满了再去操作IO. 这样是为了提高效率。


    下面是测试代码:

    方案1:

    #include<stdio.h>
    #include<unistd.h>
    
    void main()
    {
            int i;
            for(i=0;i<10;i++)
            {
                    printf("\r %d%% is complete.\n",i);
                    sleep(1);
            }
            printf("\n");
    }
    


    方案2:

    #include<stdio.h>
    #include<unistd.h>
    
    void main()
    {
            int i;
            for(i=0;i<10;i++)
            {
                    printf("\r %d%% is complete.",i);
                    fflush(stdout);
                    sleep(1);
            }
            printf("\n");
    }
    


    #include<stdio.h>
    #include<unistd.h>
    
    void main()
    {
            int i;
            setvbuf(stdout,NULL,_IONBF,0); //直接将缓冲区禁止了. 它就直接输出了
            for(i=0;i<10;i++)
            {
                    printf("\r %d%% is complete.",i);
                    sleep(1);
            }
            printf("\n");
    }
    




    展开全文
  • 两者的区别在于puts的功能更单一,只能输出字符串,而printf可以根据给定的格式输出多种类型的数据。1、puts()函数用来向标准输出设备(屏幕)写字符串并换行,其调用方式,puts(s);其中s字符串字符(字符串数组名...

    两者的区别在于puts的功能更单一,只能输出字符串,而printf可以根据给定的格式输出多种类型的数据。

    1、puts()函数用来向标准输出设备(屏幕)写字符串并换行,其调用方式为,puts(s);其中s为字符串字符(字符串数组名或字符串指针)。

    1

    2

    3

    4

    5

    6

    7

    #include 

    int main()

    {

    char string[] = "This is an example output string\n";

    puts(string);

    return 0;

    }

    2、printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。

    printf()函数的调用格式为: printf("", )。

    格式输出,它是c语言中产生格式化输出的函数(在 stdio.h 中定义)。用于向终端(显示器、控制台等)输出字符。格式控制由要输出的文字和数据格式说明组成。要输出的的文字除了可以使用字母、数字、空格和一些数字符号以外,还可以使用一些转义字符表示特殊的含义。

    示例:通过printf函数输出字符串、有符号整数、单精度浮点数、双精度浮点数。

    1

    2

    3

    4

    5

    6

    #include

    int main()

    {

    printf("%s\t%d%\t%f\t%e\n", "hello world", 1, 1.1f , 1.1);

    return 0;

    }

    3、printf控制字符的格式:

    ① d格式:用来输出十进制整数。有以下几种用法:

    %d:按整型数据十进制的实际长度输出。

    %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。

    %ld:输出长整型数据。

    ② o格式:以无符号八进制形式输出整数。

    %d:按整型数据八进制的实际长度输出。

    %lo:对长整型可以用格式输出

    %mo:指定字段宽度用格式输出

    ③ x格式:以无符号十六进制形式输出整数。

    %x:按整型数据十六进制的实际长度输出。

    %lx:对长整型可以用格式输出

    %mx:指定字段宽度用格式输出

    ④ u格式:以无符号十进制形式输出整数。

    %u:按无符号整型数据十进制的实际长度输出。

    %lu:对长整型可以用格式输出

    %mu:指定字段宽度用格式输出

    ⑤ c格式:输出一个字符。

    ⑥ s格式:用来输出一个串。有几中用法

    %s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。

    %ms:输出的字符串占m列,如字符串长度大于m,将字符串全部输出。若串长小于m,则左补空格。

    %-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。

    %m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。

    %-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。

    ⑦ f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:

    %f:不指定宽度,整数部分全部输出并输出6位小数。

    %m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。

    %-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。

    ⑧ e格式:以指数形式输出实数。可用以下形式:

    %e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。

    %m.ne和%-m.ne:m、n和”-”字符含义与前相同。

    此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。

    ⑨ p格式:输出指针地址

    https://www.zhihu.com/question/35991560

    展开全文
  • C语言初学,想知道为什么用visual c++6.0编程,printf("%B")不能正确显示%B,而puts函数却可以,求告知?
  • 缺乏交互的单片机不过,这两节制作的小灯时,我们把使用 C语言编写的控制程序烧写到单片机后,就无法再控制 LED 小灯了,也就是说,“只能看不能动”,交互性比较差。接下来两节,将介绍一种交互方法,目的是烧写 ...
  • 字符串输入函数gets()调用gets()函数实现字符串的输入,其调用形式:gets(字符数组);功能:从终端输入一个字符串(包括空格)赋给从字符数组起始的存储单元中,直到读入一个回车符为止。回车符读入后,作为字符...
  • 一个float 变量赋值为3.1 时, 为什么printf 输出的值为3.0999999? 大多数电脑都是用二进制来表示浮点和整数的。在十进制里, 0.1 是个简单、精确的小数, 但是用二进制表示起来却是个循环小数0.0001100110011 . . . ...
  • 《你必须知道的495个C语言问题》第12章标准输入输出库,本章的很多问题都跟...为什么printf()用%f输出double型,而scanf却用%lf呢?  示例:double x;scanf(“%f”,&x);输入“123.4”,输出x的值结果为0,没
  • 为什么printf()用%f输出double型,而scanf却用%lf呢? 答:printf的%f说明符的确既可以输出float型又可以输出double型。 根据"默认参数提升"规则(在printf这样的函数的可变参数列表中 ,不论作用域内有没有原型,...
  • 为什么不能输出max ![图片说明](https://img-ask.csdn.net/upload/201910/18/1571394394_979731.png) #include int main() { int max(int x, int y); int a, b, c; scanf("%d,%d", &a,&b); ...
  • 很多人在用 printf 函数进行串口打印的时候,都会被告知需要重定向 fputc 函数(别的平台可能不是这个函数),...使用 51 的时候,我们也可以使用 printf 函数,但是我们并没有进行重定向,也使用,这又是为什么?对...
  •  示例:double x;scanf(“%f”,&x);输入“123.4”,输出x的值结果0,没有接收...这是因为用户定义x双精度型数据,而用“%f”格式输入数据,仍不能接收,应该使用“%lf”或“%le”,即scanf(“...
  • scanf(“%f”,&x);输入“123.4”,输出x的值结果0,没有接收输入的数据,再输入...这是因为用户定义x双精度型数据,而用“%f”格式输入数据,仍不能接收,应该使用“%lf”或“%le”,即scanf(“%lf”,&x...
  • 原创首发:鱼鹰谈单片机很多人在用printf函数进行串口打印的时候,都会被告知需要重定向fputc函数...使用51的时候,我们也可以使用printf函数,但是我们并没有进行重定向,也使用,这又是为什么?对于经验丰富的...
  • 这是因为用户定义x双精度型数据,而用“%f”格式输入数据,仍不能接收,应该使用“%lf”或“%le”,即scanf(“%lf”,&x);此时输入“123.4”即可接收。因此长整型数据和双精度型数据必须使用附加格式说明字符l,...
  • (排序请按1,查找请按2,需要输入3)\n"); scanf("%d",&x); if(x==3) break; case 2: if(x==2) { printf("请输入学号查找(学号唯一):"); scanf("%s",num); for(t=0;t;t++...
  • 使用51的时候,我们也可以使用printf函数,但是我们并没有进行重定向,也使用,这又是为什么? 对于经验丰富的人来说,这些问题心里应该都有答案,但考虑到有一些道友可能并了解,所以今天就稍微水那么一篇吧。 ...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 357
精华内容 142
关键字:

为什么printf不能输出