我创建了一个自动打字机器人,它模拟用户给定的字符串字符。
我的代码是:
printf("Enter speed (wpm) (1 to 11750):");
scanf("%d", &speed);
if(speed < 1 || speed > 11750)
{
printf("nPlease provide CORRECT DATAn");
return -1;
}
printf("Paste the String : n");
gets(exaArray);
exaArrayLength = strlen(exaArray);
relation = (int)11750/speed;
printf("typing will start in 2 sec-n");
Sleep(2000);
i=pos=0;
while(i<=exaArrayLength)
{
Sleep(relation);
if((exaArray[pos]>96) && (exaArray[pos]<123)) //small letters
{
keycode=0x41 + (exaArray[pos]%97);
smallLetter(keycode); //function for key simulation
}
.....
我正在使用get函数获取输入。当我粘贴不包含Enter的文本时,这个程序运行良好。所以这个程序只需一段就能很好地工作。但是,如果用户提供了多个段落,那么它只模拟第一个段落。
因为gets
终止于'\n'。哪个函数可以接受多个段落输入并将其分配给一个字符串。
这实际上是一个非常困难和复杂的问题,不容易以自动化的方式解决。
循环阅读似乎是一个很好的解决方案,但当没有更多输入时,阅读功能就会阻止等待更多输入。最简单的方法是让用户输入"文件结尾"组合键(在Linux或OSX等POSIX系统上CTRL-D,在Windows上CTRL-Z 这个问题源于你的程序根本不知道它应该读取多少数据,而且当用户认为"就这样,没有更多的数据"时,根本没有一个功能能够读取用户的想法。 除了上面让用户给出"文件结束"的解决方案外,你还可以使用其他序列或特殊键,甚至输入短语来标记结束,但归根结底:循环读取输入,直到用户说"不再输入"。
好吧,计算机无法区分用户按回车键和"粘贴"的包含换行符的字符串。(从技术上讲,把东西粘贴到控制台就像打字一样。)
如果你只是不想让问题在一段之后退出,而是继续,你可以按照评论者alk的建议来做(循环阅读功能)——然后你需要Ctrl+C退出程序,从技术上讲,一次只写一段。这取决于你进一步想对程序做什么。
另一方面,如果您想让用户一次输入所有文本,然后再进行处理,则需要将"换行符"以外的内容定义为"输入结束"标记,例如类似ESC的内容。
要做到这一点,可以使用getchar
而不是gets
,并手动将以这种方式输入的每个字符连接到字符串缓冲区,例如,如果字符的值为27
(转义键),则可以结束输入循环并开始输出。