0

嗨,我是 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而每次都被重写。虽然它可能对人们来说太快了,但我仍然知道它在那里,我不喜欢它。我该如何解决这个问题?

4

2 回答 2

3

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

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

例如,从上面的文档中,将光标向后移动 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 编程库之类的东西,它将允许“全屏”控制光标和您的输出。

于 2012-06-23T04:16:02.330 回答
0

如果问题是一遍又一遍地打印出“随机数是”,为什么不直接执行 printf("%d\r",dec1);

这将在最后一个之后打印每个新数字。当然,除非您做一些真正花哨的事情,否则您将无法覆盖您已经编写的终端输出。

于 2012-06-23T03:30:22.720 回答