2016-04-28 84 views
0

当我有一个简单的C程序:蚀控制台窗口奇怪输出行驶C程序

#include<stdio.h> 
    int main() { 
    int k, r; 
    long int i = 0l, j = 1, f; 

    printf("FIBONACCI SERIES:\n"); 

    // Taking maximum numbers from user 
    printf("Enter the number range:"); 
    scanf("%d", &r); 

    // Printing first two values. 
    printf("\n%ld %ld", i, j); 

    for (k = 2; k < r; k++) { 
     f = i + j; 
     i = j; 
     j = f; 
     printf(" %ld", j); 
    } 

    return 0; 
    } 

当我在C/C++控制台i必须首先对输入一个数字(scanf的),在这之后的所需蚀运行它输出显示。第一个输出应该是:

printf(“FIBONACCI SERIES:\ n”);

但是不。我必须先输入一个数字。那么剩下如下:

-------------------------- 
8 
FIBONACCI SERIES: 
Enter the number range: 
0 1 1 2 3 5 8 13 
-------------------------- 

当我运行在CMD窗口中excutable文件,它可以作为希望......

FIBONACCI SERIES: 
Enter the number range:8 

0 1 1 2 3 5 8 13 

(刚开始使用Eclipse)。谢谢。

更改为:

#include<stdio.h> 
int main() { 
int k, r; 
long int i = 0l, j = 1, f; 

printf("FIBONACCI SERIES:\n"); 

// Taking maximum numbers from user 
printf("Enter the number range:\n"); 
scanf("%d", &r); 

// Printing first two values. 
printf("\n%ld %ld", i, j); 

for (k = 2; k < r; k++) { 
    f = i + j; 
    i = j; 
    j = f; 
    printf(" %ld", j); 
} 
printf("\n"); 
return 0; 
} 

相同的结果:

------------------------------- 
8 
FIBONACCI SERIES: 
Enter the number range: 

0 1 1 2 3 5 8 13 
------------------------------- 
+1

如果你把'newline'在提示结束时会发生什么像'printf(“输入数字范围:\ n”);'?真的,系列印刷之后应该有一个最后的'换行'。 –

+0

有一个已知的臭虫控制台输出,现在挂了几年现在... –

+0

感谢**很多**。现在我会和它一起生活。 – czt

回答

0

你看到这里的问题是到缓冲。当您在Eclipse控制台中运行程序时,您正在使用管道进行操作,并且标准库将随之缓冲。但是,当你从终端运行时,你会获得tty缓冲。默认情况下,管道缓冲stdout将被完全缓冲,但在终端中它将被行缓冲。

你可以通过简单的刷新缓冲区来解决这个问题。

fflush(stdout); 
printf

/前scanf

另外,您可以强制缓冲带setbuf

这里是man setbuf键位:

通常所有文件都是块缓冲。如果一个流指向一个 终端(正常情况下是标准输出),它是行缓冲的。 标准错误流stderr默认情况下始终未缓冲。

最后一点要注意,你应该能够运行您的程序通过tee重现终端的问题:

$ ./fib_from_so 
FIBONACCI SERIES: 
Enter the number range:8 

0 1 1 2 3 5 8 13 

$ ./fib_from_so | tee output 
8 
FIBONACCI SERIES: 
Enter the number range: 
0 1 1 2 3 5 8 13