scanf读取“Enter”键

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

#include  #include  #include  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()等待char-string,由空格分隔,输入等等。所以,它只是忽略了ENTER,并等待“真正的非空字符串”。 如果你想获得空字符串,你需要使用

 fgets(msg, 100, stdin); 

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


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

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

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

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