c - scanf 读取 "Enter"键

标签 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);
}

最佳答案

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

最好接受一个\n,使用fgets()

char msg[100];
if (fgets(msg, sizeof msg, stdin)) {
  // success

如果你需要使用scanf()

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

这将扫描 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_end_of_file_or_IOError();

关于c - scanf 读取 "Enter"键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19794268/

相关文章:

c - Scanf() - %a 格式/转换说明符是什么?

c - scanf 之后 fgets 不起作用

vim - 在编辑器中查看换行符和回车符

excel - R读取带回车的Excel文件

c++ - 我不明白为什么我在按位或短字符和字符时得到这个结果

c - 取消设置字中的最高有效位 (int32) [C]

c - 将(sscanf)大整数扫描成字节

c - 用大括号定义

c++ - 是否有用于 double 平方根倒数的快速 C 或 C++ 标准库函数?

newline - Web 表单中的换行符是否有标准?