How to input of a string which contain ‘\n’ in it
我创建了一个自动打字机器人,它模拟用户给出的字符串字符。
我的代码是这样的:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
printf(“Enter speed (wpm) (1 to 11750):”);
scanf(“%d”, &speed); if(speed < 1 || speed > 11750) { printf(“\ Please provide CORRECT DATA\ “); return –1; } printf(“Paste the String : \ while(i<=exaArrayLength) |
我正在使用gets 函数进行输入。当我粘贴不包含 Enter 的文本时,该程序运行良好。所以这个程序适用于一个段落。
但是如果用户提供了多个段落,那么它只模拟第一段。
因为 gets 终止于 \\’\\\\
\\’。哪个函数可以接受多个段落输入并将其分配给一个字符串。
- 循环读取函数,连接到目前为止已读取的内容。
- OT:Aaand 不要使用 gets(),而是使用 fgets()。
-
@alk 先生,如果我使用这样的输入 – fgets(s, 20000, stdin);当有 Enter 或 \\ 时,此语句是否会终止
在用户输入中? - @Prabhakarrai 是的,但至少您不必担心缓冲区溢出。此外,在最新的 C 标准 C11 中,实际上已经删除了 gets 函数。
- 您应该将 fgets() 作为第二个参数传递给第一个参数所指的大小。这与在读取换行符时停止输入无关,而是与代码安全有关。
- 运行 google 搜索”此处文档”以查看 bash 如何处理此问题。另一种选择是将字符串存储在文件中,然后将其作为参数提供给程序。
这实际上是一个非常困难和复杂的问题,并且不容易以自动化的方式解决。
循环读取似乎是一个很好的解决方案,但是当您没有更多输入并且读取功能只是阻塞等待更多输入时,您会遇到这种情况。最简单的方法是让用户输入”文件结尾”组合键(在 Linux 或 OSX 等 POSIX 系统上为 CTRL-D,在 Windows 上为 CTRL-Z),但随后必须告知用户这样做那个。
问题源于您的程序根本不知道它应该读取多少数据,并且基本上没有功能能够在用户认为”就是这样”时读取用户的想法,没有更多数据”。
除了让用户给出”文件结尾”的上述解决方案之外,您还可以使用其他序列或特殊键甚至输入短语来标记结尾,但这一切都归结为:读取输入一个循环,直到用户说”不再输入”。
好吧,计算机无法区分用户按下回车键和包含换行符的”粘贴”字符串。 (从技术上讲,将某些内容粘贴到控制台中就像键入它一样。)
如果您只是不希望问题在一段后退出但继续,您可以按照评论者 alk 的建议进行操作(循环阅读功能) – 然后您需要 Ctrl C 退出程序然后在那里从技术上讲,仍然是一次写一段。取决于您想进一步使用该程序做什么。
另一方面,如果您希望用户一次输入所有文本然后再对其进行处理,则需要将 “newline” 以外的其他内容定义为 “end of input” 标记, 例如像 ESC.
您可以通过使用 getchar 而不是 gets 并手动将以此方式输入的每个字符连接到字符串缓冲区来执行此操作,例如,如果该字符具有值 27 (转义键),您将结束输入循环并开始输出。
来源:https://www.codenong.com/37003004/