如何输入包含'\n'的字符串
How to input of a string which contain '\n' in it
我创建了一个自动输入机器人,它模拟用户给出的字符串字符。
我的代码是这样的:
printf("Enter speed (wpm) (1 to 11750):");
scanf("%d", &speed);
if(speed < 1 || speed > 11750)
{
printf("\nPlease provide CORRECT DATA\n");
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
}
.....
我正在使用 gets 函数获取输入。当我粘贴不包含 Enter 的文本时,该程序工作正常。所以这个程序用一个段落就可以正常工作。
但是如果用户提供了多个段落,那么它只模拟第一段。
因为 gets
在 '\n' 处终止。哪个函数可以接受多个段落输入并将其分配给一个字符串。
嗯,计算机无法区分用户按回车键和包含换行符的 "pasted" 字符串。 (从技术上讲,将内容粘贴到控制台就像键入内容一样。)
如果您只是不想让问题在一段之后退出而是继续,您可以按照评论者 alk 的建议进行(循环阅读功能)——那么您需要 Ctrl+C 退出程序,然后那么在技术上仍然会一次写一个段落。取决于你进一步想用这个程序做什么。
另一方面,如果您想要一种让用户一次输入所有文本然后才对其进行处理的方法,则需要将 "newline" 以外的内容定义为 "end of input" 标记,例如 ESC.
您可以通过使用 getchar
而不是 gets
并手动将以这种方式输入的每个字符连接到字符串缓冲区来执行此操作,如果该字符的值为 27
(转义键)例如,您将结束输入循环并开始输出。
这实际上是一个非常困难和复杂的问题,并且不容易以自动化的方式解决。
循环读取似乎是一个很好的解决方案,但随后您会遇到没有更多输入并且读取函数只是阻塞等待更多输入的情况。最简单的方法是让用户输入 "end of file" 组合键(CTRL-D 在 POSIX 系统上,如 Linux 或 OSX, CTRL-Z on Windows), 但必须告知用户这样做。
问题源于您的程序根本不知道要读取多少数据,并且基本上没有功能能够在用户思考时读懂用户的想法"that's it, no more data" .
除了上述让用户给出"end of file"的解决方案外,您还可以使用其他序列或特殊键甚至输入短语来标记结束,但这一切都归结为:读取输入一个循环,直到用户说 "no more input".
我创建了一个自动输入机器人,它模拟用户给出的字符串字符。
我的代码是这样的:
printf("Enter speed (wpm) (1 to 11750):");
scanf("%d", &speed);
if(speed < 1 || speed > 11750)
{
printf("\nPlease provide CORRECT DATA\n");
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
}
.....
我正在使用 gets 函数获取输入。当我粘贴不包含 Enter 的文本时,该程序工作正常。所以这个程序用一个段落就可以正常工作。 但是如果用户提供了多个段落,那么它只模拟第一段。
因为 gets
在 '\n' 处终止。哪个函数可以接受多个段落输入并将其分配给一个字符串。
嗯,计算机无法区分用户按回车键和包含换行符的 "pasted" 字符串。 (从技术上讲,将内容粘贴到控制台就像键入内容一样。)
如果您只是不想让问题在一段之后退出而是继续,您可以按照评论者 alk 的建议进行(循环阅读功能)——那么您需要 Ctrl+C 退出程序,然后那么在技术上仍然会一次写一个段落。取决于你进一步想用这个程序做什么。
另一方面,如果您想要一种让用户一次输入所有文本然后才对其进行处理的方法,则需要将 "newline" 以外的内容定义为 "end of input" 标记,例如 ESC.
您可以通过使用 getchar
而不是 gets
并手动将以这种方式输入的每个字符连接到字符串缓冲区来执行此操作,如果该字符的值为 27
(转义键)例如,您将结束输入循环并开始输出。
这实际上是一个非常困难和复杂的问题,并且不容易以自动化的方式解决。
循环读取似乎是一个很好的解决方案,但随后您会遇到没有更多输入并且读取函数只是阻塞等待更多输入的情况。最简单的方法是让用户输入 "end of file" 组合键(CTRL-D 在 POSIX 系统上,如 Linux 或 OSX, CTRL-Z on Windows), 但必须告知用户这样做。
问题源于您的程序根本不知道要读取多少数据,并且基本上没有功能能够在用户思考时读懂用户的想法"that's it, no more data" .
除了上述让用户给出"end of file"的解决方案外,您还可以使用其他序列或特殊键甚至输入短语来标记结束,但这一切都归结为:读取输入一个循环,直到用户说 "no more input".