Q我正在使用scanf和%d读取一个数字,然后使用gets():
int n; char str[80]; printf("enter a number: "); scanf("%d", &n); printf("enter a string: "); gets(str); printf("you typed %d and \"%s\"\n", n, str);读取一个字符串,但编译器似乎跳过了对gets()!
A如果程序对此作出响应,您将键入这两行
42 a stringscanf会读取 42,但不会读取其后的换行符。该换行符将保留在输入流中,它将立即满足gets()(因此它似乎读取了一个空行)。第二行,“a string”,根本不会被读取。
如果您恰好在同一行键入了数字和字符串
42 a string代码的工作方式将与您预期的差不多。
总的来说,您不应该尝试交织调用scanf与调用gets()(或任何其他输入例程);scanf对换行符的特殊处理几乎总是会带来麻烦。要么使用scanf来读取所有内容或不读取任何内容。
其他链接: 更长的解释
参考文献: ISO 第 7.9.6.2 节
H&S 第 15.8 节 pp. 357-64