| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1029 人关注过本帖
标题:新手请教个printf问题
取消只看楼主 加入收藏
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
新手请教个printf问题
最近学习K&R写的那本C语言程序设计,在练习题1-8中碰到了个pringt()函数问题,很是疑惑,请各位前辈们指教 指教!

这个是练习题中的源程序,在我这里不能正常显示!只能显示输入的字符没有计数统计显示!
程序代码:
#include <stdio.h>

main()

{
    int c, nb, nt, nl;

    nb = 0;
    nt = 0;
    nl = 0;

    while ((c = getchar()) != EOF){

        if (c == ' ')
            ++nb;
        if (c == '\t')
            ++nt;
        if (c == '\n')
            ++nl;

    }

    printf("%d %d %d\n", nb, nt, nl); /*  printf() 放在这里不显示nb, nt, nl
    
                                          只显示输入的字符*/
}


下面这是我把printf() 写到 while 后面的花括号内才能正常显示,但都是显示两行!
程序代码:
#include <stdio.h>

main()

{
    int c, nb, nt, nl;

    nb = 0;
    nt = 0;
    nl = 0;

    while ((c = getchar()) != EOF){

        if (c == ' ')
            ++nb;
        if (c == '\t')
            ++nt;
        if (c == '\n')
            ++nl;

    printf("%d %d %d\n", nb, nt, nl); /* printf() 放在这里显示nb, nt, nl 
    
                                        和输入字符都可以正常显示,只是有两行*/

    }

}


请前辈们帮忙解释一下好吗?感谢!
搜索更多相关主题的帖子: 练习题 C语言 源程序 统计 程序设计 
2015-09-16 14:28
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
收藏
得分:0 
感谢您的回复! 这个是统计空格,换行,还有制表符个数的.以下代码我做了详细注释
程序代码:
#include <stdio.h>

main()

{
    int c, nb, nt, nl;

    nb = 0;    /* nb , nt, nl 初始化为0 */
    nt = 0;
    nl = 0;

    /* while 判断输入字符是否有文件结束符 */
    while ((c = getchar()) != EOF){

        if (c == ' ')   /* 如果输入有空格*/
            ++nb;       /* nb 为空格+1操作*/
        if (c == '\t')  /* 如果输入有制表符*/
            ++nt;       /* nt 为制表符+1操作 */
        if (c == '\n')  /* 如果输入有换行符 */
            ++nl;       /* nl 为换行符 +1操作 */

    }

    printf("%d %d %d\n", nb, nt, nl); /*  printf() 放在这里不显示nb, nt, nl
    
                                          只显示输入的字符*/
}
2015-09-16 14:58
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
收藏
得分:0 
是没什么问题啊!可是我不能正常显示!只能把 pringt() 函数写道 while 后面的花括号内才行!也能正常计数和显示了!真是不解!就是下面这样才正常!
程序代码:
#include <stdio.h>

main()

{
    int c, nb, nt, nl;

    nb = 0;
    nt = 0;
    nl = 0;

    while ((c = getchar()) != EOF){

        if (c == ' ')
            ++nb;
        if (c == '\t')
            ++nt;
        if (c == '\n')
            ++nl;

    printf("%d %d %d\n", nb, nt, nl); /* printf() 放在这里显示nb, nt, nl 
    
                                        和输入字符都可以正常显示,只是有两行*/

    }

}

2015-09-16 15:07
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
收藏
得分:0 
林斑说的不是条件不满足吗?我这条件都满足了啊?再说了这是书上练习题的源码啊!条件无非就是我按回车按空格按制表符了吗?这肯定得按啊!条件判断语句也没问题啊?
2015-09-16 15:30
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
收藏
得分:0 
我是Linux系统.10年linux经验,就是会点python,shell什么的,命令行是都明白啊!闭着眼一样用!就是最近想深入学习一下C,学学内核,这难道和系统有关系吗?C不是在Unix开发的吗? 和linux也差不多啊
2015-09-16 15:41
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
收藏
得分:0 
我这里显示 EOF 是 -1
2015-09-16 15:48
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
收藏
得分:0 
谢谢,这还得好好看看。终于解决了!加个return 0; 完事! 应该是stdio.h 调用的事
2015-09-16 16:07
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
收藏
得分:0 
这是Gcc生成的汇编代码能看出来什么吗?
程序代码:
    
.file   "test.c"
    .section    .rodata
.LC0:
    .string "%d %d %d\n"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    leal    4(%esp), %ecx
    .cfi_def_cfa 1, 0
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    .cfi_escape 0x10,0x5,0x2,0x75,0
    movl    %esp, %ebp
    pushl   %ecx
    .cfi_escape 0xf,0x3,0x75,0x7c,0x6
    subl    $20, %esp
    movl    $0, -12(%ebp)
    movl    $0, -16(%ebp)
    movl    $0, -20(%ebp)
    jmp .L2
.L5:
    cmpl    $32, -24(%ebp)
    jne .L3
    addl    $1, -12(%ebp)
.L3:
    cmpl    $9, -24(%ebp)
    jne .L4
    addl    $1, -16(%ebp)
.L4:
    cmpl    $10, -24(%ebp)
    jne .L2
    addl    $1, -20(%ebp)
.L2:
    call    getchar
    movl    %eax, -24(%ebp)
    cmpl    $-1, -24(%ebp)
    jne .L5
    pushl   -20(%ebp)
    pushl   -16(%ebp)
    pushl   -12(%ebp)
    pushl   $.LC0
    call    printf
    addl    $16, %esp
    movl    -4(%ebp), %ecx
    .cfi_def_cfa 1, 0
    leave
    .cfi_restore 5
    leal    -4(%ecx), %esp
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Debian 4.9.2-10) 4.9.2"
    .section    .note.GNU-stack,"",@progbits
2015-09-16 17:23
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
收藏
得分:0 
以下是引用jklqwe111在2015-9-16 16:23:55的发言:


不见得这么简单吧,getchar()函数当取完缓冲区的数据时,只是等待再次输入数据,并不返回EOF,只有在出错时才返回EOF,所以你的条件并不能判断输入结束,死循环难免


明白了,明白了!这个程序主要是没有监测到文件尾
getchar() 不是真正的函数,而是被定义为预处理宏,和文件结尾,缓冲,键盘输入有关,Unix和linux下 传送 EOF值可用 Control+D
2015-09-16 19:20
快速回复:新手请教个printf问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033424 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved