prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 12.19

我想我可以用scanf通过检查其返回值来确保用户输入了我期望的数字值,从而使其更安全

	int n;

	while(1) {
		printf("enter a number: ");
		if(scanf("%d", &n) == 1)
			break;
		printf("try again: ");
	}

	printf("you typed %d\n", n);
但有时它似乎会进入无限循环。为什么?[脚注]


scanf尝试转换数字时,它遇到的任何非数字字符都会终止转换并留在输入流中。 因此,除非采取其他步骤,否则意外的非数字输入会``卡住''scanf一次又一次scanf永远无法通过错误的字符到达后面有效的数据。 如果用户键入类似“x”的字符来响应上面的代码,该代码将循环打印“再试一次”,但不会给用户尝试的机会。

您可能想知道为什么scanf将无法匹配的字符留在输入流中。 假设您有一个紧凑的数据文件,其中包含由数字和字母代码字符串组成的行,没有插入空格,例如

	123CODE
您可能想使用scanf解析此数据文件,使用格式字符串"%d%s"。 但是如果%d转换没有将不匹配的字符留在输入流中,%s将错误地读取"ODE"来解决这个问题,而不是"CODE"。(这个问题是词法分析中的一个标准问题:在扫描任意长度的数字常量或字母数字标识符时,在读“太远”之前,你永远不知道它在哪里结束。这是其中一个原因ungetc存在。)

另请参见问题 12.20

参考资料:ISO Sec. 7.9.6.2
H&S 第 15.8 节 pp. 357-64


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管