文字被重写了1000次?

时间:2012-06-23 03:24:38

标签: c random

嗨,我是c的新手,我随后编写了一个随机数应用程序:

#import "stdio.h"
#import "stdlib.h"
#import "time.h"
int main (int argc, char *argv[]){
    unsigned int iseed = (unsigned int)time(NULL);
    srand (iseed);
    int Ran;
    int N;
    int max;
    int min;
    int dec;
    int dec1;
    printf("Enter Max Value: \n");
    scanf ("%i",&max);
    printf("Enter Min Value: \n");
    scanf ("%i",&min);
    Ran=rand ();
    N=(Ran % (max+1-min))+min;
    //this is a decoration
    for(i=1;i<1000;i++){
        dec=rand ();
        dec1=(dec % (max+1-min))+min;
        printf("Random Number is %d\r",dec1);
        sleep(10)
     }
    printf ("Random Number is %d",N);
    getchar();

它要求您输入最大值和最小值,然后显示“随机数为%%”,%%部分每10毫秒更改一次。问题是“随机数是”每次都会因为\ r而被重写。虽然人们看到它可能太快了,但我仍然知道它在那里,我不喜欢它。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

在大多数终端上,您可以使用ANSI control sequences将光标移动到屏幕上的任何位置。

为了仅重写数字部分,您需要做的是将光标向后移动足够远,以便它仅覆盖下一个循环中的数字部分。

例如,从上面的文档中,将光标向后移动COUNT个字符的ANSI代码是:

  

向后光标:<ESC>[{COUNT}D

     

将光标向后移动COUNT列;默认计数为1。

所以你会做类似的事情:

// Pseudocode..
printf("The random number is: ");
for (...) {
   printf("%5d", dec1); // Print a 5 field wide number
   printf("\e[5D");     // Move cursor back 5 steps
   ...
}

然而,你不应该真的担心每次重印这条线。执行此操作以便仅重新打印数字的机制只会使代码不必要地复杂化。你必须看看奖励和奖励复杂性与努力。现代计算机打印文本的速度远远超过您需要担心的速度。

此外,如果您只打印该号码,那么如果用户在程序运行时碰巧输入终端,整个序列将会搞砸,并且屏幕上的内容会开始变得奇怪。通过重新打印整行来自用户(或可能来自其他地方)的虚假垃圾字符不会弄乱输出,因为它只会在下一个循环中重新生成所有内容。

所以,是的,你只能用数字来做,但它会变得混乱,在我看来,这是不值得的。我实际上更喜欢重印整行。

但是,如果你正在构建一些更复杂的东西,你想要对屏幕和光标进行大量控制,那么你可以看一下像curses programming library这样的东西,这将允许光标的“全屏”控制和你的输出。

答案 1 :(得分:0)

如果问题是一遍又一遍地打印出“随机数”,为什么不这样做呢     的printf( “%d \ r”,DEC1);

这将在最后一个之后打印每个新号码。当然,除非你做一些非常喜欢的事情,否则你将无法覆盖你已经写过的终端输出。