【问题标题】:How to input of a string which contain '\n' in it如何输入包含'\n'的字符串
【发布时间】:2016-05-03 11:34:04
【问题描述】:

我创建了一个自动打字机器人,它模拟用户给出的字符串字符。

我的代码是这样的:

    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' 处终止。哪个函数可以接受多个段落输入并将其分配给一个字符串。

【问题讨论】:

  • 循环阅读函数,连接到目前为止已阅读的内容。
  • OT: 并且使用gets(),而是使用fgets()
  • @alk 先生,如果我使用这样的输入 - fgets(s, 20000, stdin);当用户输入中有 Enter 或 \n 时,此语句不会终止吗?
  • @Prabhakarrai 是的,但至少您不必担心缓冲区溢出。此外,在最新的 C 标准 C11 中,gets 函数实际上已被删除。
  • 您应该将fgets() 作为第二个参数传递给您第一个所指的大小。这与在读取换行符时停止输入无关,而是与代码安全有关。

标签: c user-input


【解决方案1】:

这实际上是一个非常困难和复杂的问题,并且不容易以自动化的方式解决。

循环读取似乎是一个很好的解决方案,但是当您没有更多输入并且读取函数只是阻塞等待更多输入时,您会遇到这种情况。最简单的方法是让用户输入“文件结尾”组合键(在 Linux 或 OSX 等 POSIX 系统上为 CTRL-D,在Windows),但必须告诉用户这样做。

问题源于您的程序根本不知道它应该读取多少数据,并且当用户认为“就是这样,没有更多数据时,基本上没有功能能够读取用户的想法”。

除了让用户给出“文件结尾”的上述解决方案之外,您还可以使用其他序列或特殊键甚至输入短语来标记结尾,但这一切都归结为:在循环中读取输入直到用户说“不再输入”。

【讨论】:

    【解决方案2】:

    好吧,计算机无法区分用户按下回车键和包含换行符的“粘贴”字符串。 (从技术上讲,将某些内容粘贴到控制台中就像在输入内容一样。)

    如果您只是不希望问题在一段后退出但继续,您可以按照评论者 alk 的建议进行操作(循环阅读功能) - 那么您需要 Ctrl+C 退出程序然后在那里从技术上讲,仍然是一次写一段。取决于你想用这个程序做什么。

    另一方面,如果您希望用户一次输入所有文本然后再对其进行处理,则需要将“换行符”以外的其他内容定义为“输入结束”标记,例如像 ESC。

    您可以通过使用 getchar 而不是 gets 并手动将以此方式输入的每个字符连接到字符串缓冲区来执行此操作,例如,如果字符具有值 27(转义键),您将结束输入循环并开始输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2021-12-26
      • 2011-06-27
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      相关资源
      最近更新 更多