嗨,我是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而被重写。虽然人们看到它可能太快了,但我仍然知道它在那里,我不喜欢它。我该如何解决这个问题?
答案 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);
这将在最后一个之后打印每个新号码。当然,除非你做一些非常喜欢的事情,否则你将无法覆盖你已经写过的终端输出。