为什么在下面的代码中输入“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);
}
答案 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语句中删除换行转义字符。