【问题标题】:scanf reading "Enter" keyscanf 读取“Enter”键
【发布时间】:2016-10-24 21:52:48
【问题描述】:

为什么我在下面的代码中输入“Enter”时scanf不起作用?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char**argv)
{
 char *msg = malloc(100*sizeof(char));
 do{
        scanf("%s",msg);
        printf("%s\n",msg);
 } while(strcmp(msg,"")!=0);
}

【问题讨论】:

  • 那么,你在scanf之后的msg数组中看到了什么?
  • scanf 跳过空格来寻找你的字符串。输入(换行符)是空格。
  • 查理,有办法scanf 不要跳过空格?
  • @vs06,下面的答案有两个选项。

标签: c scanf carriage-return


【解决方案1】:

scanf("%s",... 中的 "%s" 跳过前导空格(包括“Enter”或\n),因此耐心等待一些非空格文本。

最好使用\n,按照@maxihatop 的建议使用fgets()

fgets(msg, 100, stdin);

如果您需要使用scanf()

int result = scanf("%99[^\n]%*c", msg);
if (result != 1) handle_IOError_or_EOF();

这将扫描 1 到 99 个非\n 字符,然后附加一个\0。然后它将继续扫描另外 1 个char(可能是\n),但由于* 而不会保存它。如果第一个字符是'\n',则msg 不会更改,'\n' 仍保留在stdin 中。


编辑 (2016):为了处理以 '\n' 开头的行,请将查找尾随 '\n' 的扫描分开。

msg[0] = '\0';
int result = scanf("%99[^\n]", msg);
scanf("%*1[\n]");
if (result == EOF) handle_IOError_or_EOF();

【讨论】:

    【解决方案2】:

    由于 scanf() 等待字符字符串,由空格分隔,输入等。所以,它只是忽略 ENTER,并等待“真正的非空字符串”。如果你也想得到空字符串, 你需要使用

    fgets(msg, 100, stdin);
    

    【讨论】:

      【解决方案3】:

      Scanf 在输入缓冲区中查找指定格式,在本例中为字符串。这具有跳过空格的效果。如果你在措辞之间放一个空格,它会跳过寻找下一个字符串的空格,同样它会跳过制表符、换行符等。看看如果你放一个 %c 会发生什么。它将选择换行符,因为它现在正在搜索一个字符,并且 '\n' 构成一个有效字符。

      如果您希望在获取空白时获得相同的效果,请将其更改为 %c 并在 print 语句中删除换行符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        相关资源
        最近更新 更多