3

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

3 回答 3

5

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

最好按照@maxihatop 的建议\n使用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),但由于*. 如果第一个字符是 a '\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();
于 2013-11-05T17:06:40.897 回答
3

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

fgets(msg, 100, stdin);
于 2013-11-05T16:52:47.477 回答
0

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

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

于 2013-11-05T16:55:01.180 回答