scanf读取“Enter”键

时间:2013-11-05 16:46:06

标签: c scanf carriage-return

为什么在下面的代码中输入“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);
}

3 个答案:

答案 0 :(得分:5)

"%s"中的scanf("%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仍保留在'\n'中。


修改(2016):要处理以'\n'开头的行,请将查找尾随msg[0] = '\0'; int result = scanf("%99[^\n]", msg); scanf("%*1[\n]"); if (result == EOF) handle_IOError_or_EOF(); 的扫描分开。

{{1}}

答案 1 :(得分:3)

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

fgets(msg, 100, stdin);

答案 2 :(得分:0)

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

如果在获取空格时想要获得相同的效果,请将其更改为%c并在print语句中删除换行转义字符。