标题:新手请教个printf问题
只看楼主
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
linux 和 windows 结束输入流的控制字符不一样

DO IT YOURSELF !
2015-09-16 15:47
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
得分:0 
我这里显示 EOF 是 -1
2015-09-16 15:48
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
我是Linux系统.10年linux经验,就是会点python,shell什么的,命令行是都明白啊!闭着眼一样用!就是最近想深入学习一下C,学学内核,这难道和系统有关系吗?C不是在Unix开发的吗? 和linux也差不多啊

(c = getchar()) != EOF 楼主再看一下 getchar()函数中对 EOF解释,应该立刻明了
2015-09-16 15:48
freecoco
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2015-9-16
得分:0 
谢谢,这还得好好看看。终于解决了!加个return 0; 完事! 应该是stdio.h 调用的事
2015-09-16 16:07
jklqwe111
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:35
帖 子:335
专家分:1125
注 册:2014-4-13
得分:0 
以下是引用freecoco在2015-9-16 16:07:19的发言:

谢谢,这还得好好看看。终于解决了!加个return 0; 完事! 应该是stdio.h 调用的事

不见得这么简单吧,getchar()函数当取完缓冲区的数据时,只是等待再次输入数据,并不返回EOF,只有在出错时才返回EOF,所以你的条件并不能判断输入结束,死循环难免
2015-09-16 16:23
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
青蓝诺
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-8-17
得分:0 
程序无限循环,没有终止,跳不出来。加到while花括号里面printf也算是循环的一部分了
2015-09-16 21:49
sevenkoala
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-9-17
得分:0 
你的问题是while中没有退出的条件(虽然你写了,可是当你输入空格等那三个符号的时候是一直满足while条件的,就退不出while,也就没有打印这一说了)
你可以先输三个符号,然后按ctrl+z,就可以看到打印的结果了。
2015-09-17 14:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-457363-1-1.html




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

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