Scanf返回条件

时间:2016-12-20 12:41:09

标签: c++ c

我试图理解scanf函数是如何工作的。有如下代码示例:

scanf("%c", &chr);

当我按下输入时只有enter键,它会立即返回char变量0ah值,但代码如下:

scanf("%s", str);

当我按下输入时只有enter键,它等待输入非空白字符。

以下是我的问题:

  1. scanf返回的真实条件是什么?什么是(控制)char让它返回?
  2. 为什么不在第二种情况下按enter键后才返回?

2 个答案:

答案 0 :(得分:2)

  

scanf返回的真实条件是什么?

scanf返回读取的输入数量。

scanf(" %c", &chr) - 这里scanf()正在寻找一个角色,由于换行符(' \ n')确实是一个角色,所以该程序并不会问问题,它只是选择了换行符并继续前进。

%c不会跳过空格。最简单的方法是在%c - scanf(" %c", &chr);

之前放置空格

只是提示: - 为什么要避免使用scanf?  http://c-faq.com/stdio/scanfprobs.html

答案 1 :(得分:1)

第一个问题与scanf()无关,而是缓冲。

stdin通常是行缓冲。通常,在scanf()输入之前,'\n'不会给予任何内容。

第二

从(行缓冲)scanf("%c",...)获得1个字符后,

stdin返回。任何1个字符,如'A''0'' ''\n''\0'都会被读取。 stdin中的其他字符保持缓冲以供后续阅读。函数返回1.

scanf("%s", str)有三个操作阶段:

  1. 它会读取并丢弃0个或更多的空格,例如' ''\t''\n''\r'以及其他一些空白区域,直到非白色空格找到下一步。 (此应用程序适用于除%以外的所有%c %n %[说明符。)
  2. 读取非空白字符并将其保存到str。这将继续,直到读取空白区域。
  3. 该空格将返回stdin。 (unget)并将空字符附加到strstr现在是字符串stdin中的其他字符保持缓冲以供后续阅读。函数返回1。
  4. 如果文件结尾(stdin已关闭)或罕见输入错误,则还有其他问题。