在C中一次输出一个字母

时间:2012-06-06 22:35:02

标签: c

如何在不使用Sleep()的情况下输入文字,一次输出一个字母?

3 个答案:

答案 0 :(得分:2)

睡眠是最佳选择,因为它不会浪费CPU周期。

另一种选择是忙着等待,这意味着你不断地旋转执行NoOps。你可以用任何完全没有任何东西的循环结构来做到这一点。我不确定这是为了什么,但似乎你可能也想让你在角色之间等待的时间随机化,以给它一种自然的感觉。

答案 1 :(得分:2)

我会有一个Tick()方法循环遍历字母,只有在随机数小于我设置的阈值时才会进展。

某些伪代码可能看起来像

int escapeIndex = 0;
int escapeMax = 1000000;
boolean exportCharacter = false;
int letterIndex = 0;
float someThresh = 0.000001;    

String typedText = "somethingOrOther...";
int letterMax = typedText.length();
while (letterIndex < letterMax){
escapeIndex++; 
    if(random(1.0) < someThresh){
        exportCharacter = true;
    }
    if(escapeIndex > escapeMax) {
        exportCharacter = true;
    }
    if(exportCharacter) {
        cout << typedText.charAt(letterIndex);
        escapeIndex = 0;   
        exportCharacter = false;
        letterIndex++;
    }
}    

如果我在视频游戏中这样做,可以说模拟玩家在终端中输入文字,我就是这样做的。它每次都会有所不同,它的逃逸机制为操作提供了最大时间限制。

答案 2 :(得分:0)

睡觉是做你所描述的最好的方式,因为替代方案,忙碌的等待,只会浪费CPU周期。从评论中,听起来你一直在尝试手动硬编码你想用睡眠呼叫打印的每一个字符,而不是使用循环......

由于在约20分钟后没有迹象表明这是作业,我想我会发布这段代码。它使用来自usleep的{​​{1}},如果您使用的是Windows <unistd.h>,则会睡眠X 微秒

Sleep()

由于#include <stdio.h> #include <unistd.h> void type_text(char *s, unsigned ms_delay) { unsigned usecs = ms_delay * 1000; /* 1000 microseconds per ms */ for (; *s; s++) { putchar(*s); fflush(stdout); /* alternatively, do once: setbuf(stdout, NULL); */ usleep(usecs); } } int main(void) { type_text("hello world\n", 100); return 0; } 被缓冲,因此您必须在打印每个字符(stdout)后刷新它,或者通过运行{{1}将其设置为不缓冲输出一次。

以上代码将打印fflush(stdout),每个字符之间的延迟为100毫秒;非常基本的。