[讨论] printf()肿么了

辛昕   2012-1-24 18:22 楼主
折腾完 notepad++加上 gcc编译器以后,很爽地在上边玩程序。

可是,我发现一个问题,很要命的问题。

那就是,程序里写的printf语句,程序运行时,printf内容的顺序不对头。

比如说,应该先printf信息再按照信息输入的,结果它没printf出来,非要等到我输入了才出来.......

我原以为是gcc的问题吧,因为听说编译器之间各有不同。

可是我切到cmd下去编译和运行,它却正常得很!!


强者为尊,弱者,死无葬身之地

回复评论 (13)

俺搜了搜百度,并亲自试了一下,这个方法是可行的!

那是因为默认情况下如果stdout是terminal那么stdout是行缓存的,你可以在printf后面调用fflush(stdout)来刷新缓存,立即看到printf输出。

或者,你可以改变stdout流的默认行为为“不缓存”,在程序一开始调用:

setvbuf(stdout, NULL, _IONBF, 0);

如此,以后调用printf即可马上看到输出,不必等到'\n'的出现。
强者为尊,弱者,死无葬身之地
点赞  2012-1-24 18:28
啥意思
点赞  2012-1-25 20:23

回复 沙发 辛昕 的帖子

你说的我看不懂 ! 我遇到比较麻烦的是每次需要保存后再编译,这个有点麻烦,其他还好,用的很爽!谢谢你啊!
点赞  2012-1-26 19:12

回复 4楼 小小白 的帖子

你试试这个程序好了。
如果你看不懂这个程序,先别管它,你就先运行,就行了。

  1. #include<stdio.h>
    #include<stdlib.h>

    #define LENGTH 100

    char *getString(char *buffer,char end_char);

    void main(void)
    {
    char *buffer = NULL;
    char end_char = '\n';
    buffer = (char *)calloc(LENGTH,sizeof(char));

    printf("Firstly,ENTER the ending character you want.\n");
    printf("If you don't require,just ENTER,and it would ending with the ENTER.\n");
    scanf("%c",&end_char);

    printf("You choose %c as the ending characterstic,NOW you can press in string.\n",end_char);
    buffer = getString(buffer,end_char);
    printf("%s\n",buffer);
    }

    char *getString(char *buffer,char end_char)
    {
    char i = 0;
    char j = 0;
    while( (buffer[i++] = getchar()) != end_char);
    i -= 1;
    j = i;
    for(;i < j + 5;i++)
    buffer[i] = ':';
    buffer[i] = 0;
    }

[ 本帖最后由 辛昕 于 2012-1-27 00:19 编辑 ]
强者为尊,弱者,死无葬身之地
点赞  2012-1-27 00:15
一编辑,页面就乱七八糟。
我简单说一下这个程序。

其实很简单,就是 首先 输入一个你指定的结束字符。
然后可以一顺输入一连串字符,直到遇到你指定的结束字符才停止接受输入,并输出所接收到的。
强者为尊,弱者,死无葬身之地
点赞  2012-1-27 00:22

回复 板凳 yixindianzi 的帖子

输出流出了问题。
大概是跟我弄得notepad++下那个运行终端 本身的 stdout 的特性有关系。
说不太清楚,这不是一个通病,只是在特定环境下出现的。提供了一个方法,就是改变stdout的属性,但我还没考虑过这个东西带来的隐患。
强者为尊,弱者,死无葬身之地
点赞  2012-1-27 00:23
学习了
点赞  2012-2-11 16:25
运行了一下楼主的代码
两点问题不明白:
1、printf函数
printf(\"Firstly,ENTER the ending character you want.\n\");
两个引号怎么加了转义字符,编译会通不过的
2、char *getString(char *buffer,char end_char)
这个函数是应当有返回值的,楼主你的没有返回值。
邮箱:ternence.hsu@foxmail.com
点赞  2012-2-27 09:09

在vc6.0下面编译了一下

 

Firstly,ENTER the ending character you want.
If you don't require,just ENTER,and it would ending with the ENTER.
B
You choose B as the ending characterstic,NOW you can press in string.
A
B
*
A
:::::*
Press any key to continue

 

这是编译效果
printf("*%s*\n",buffer);这里我加了两个**夹了一下输出的内容,是按照代码要求的顺序输出的。

[ 本帖最后由 37°男人 于 2012-2-27 09:46 编辑 ]
邮箱:ternence.hsu@foxmail.com
点赞  2012-2-27 09:42
刚才也在linux下面用gcc试了一下,和vc6.0运行的效果是一样的,编译加了 -Wall,多了一些警告,是关于类型的问题的。。。。。。基本没有什么问题
邮箱:ternence.hsu@foxmail.com
点赞  2012-2-27 10:20
能运行而已,你得看看输出的结果啊。

能运行只能说明语法没问题。
但是,输出的结果要对那才是。

一个特定的输入得到预期的输出还不叫正确,因为它应该可以容忍一定的错误甚至非法输入。

要保证一个程序基本没有错误,至少要在逻辑层面上没有错误那才可以保证——可以的话,还要包括完全理解所调用的函数,宏是没有问题的。
比如这个printf问题,它就完全出在它的参数到底是什么东西上。
强者为尊,弱者,死无葬身之地
点赞  2012-3-3 00:29

回复 9楼 37°男人 的帖子

带返回值的函数,调用取不取返回值,并没有什么问题。
当然,考虑到这个东西残留在栈上,也许会带来什么别的问题,但这个问题我也没搞清楚。

可以说的是,这里和这个问题关系不大。
强者为尊,弱者,死无葬身之地
点赞  2012-3-3 00:31
我在vc和linux下也一点问题都没有。
但偏偏我用 MinGW,和 notepad++就有问题。

用MinGW,在命令行模式下,有没有问题记不太清楚了,印象里是没有。
强者为尊,弱者,死无葬身之地
点赞  2012-3-3 00:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复