\ n如何影响scanf中的字符串扫描?

时间:2018-07-31 15:57:59

标签: c printf scanf

这是一个简单的示例:我有一个3个字符的数组,我在终端上写了一个输入,我想立即检查一下我扫描的内容,像这样:

scanf("%3s\n",array);
printf("%s",array);

我想知道的是:为什么在运行程序后,如果我在终端“ abc”上写东西,以使其打印出数组,我必须放入另一个输入,例如写另一个字母或数字? >

如果我写“ abcd”然后按Enter,则立即打印,但是如果我只写“ abc”并按Enter多次,它仍然不会转到下一条指令(即printf)。

我知道这与\ n如何使scanf读取字符串有关,但我不太明白。

1 个答案:

答案 0 :(得分:4)

需要额外输入的不是printf(隐含您现在编辑的标题的第一个版本),而是scanf。
您的格式字符串包含"\n"
恰好是空白。
该位置的任何空格都会告诉scanf占用三个字符(例如“ abc”)之后的任意数量的空格。
只要您继续添加空格(包括返回值),scanf就不会消耗“所有后续空格”。
一旦您输入任何非空白(例如“ d”),它就会知道“啊哈,所有空白都已完成”。然后,而不是之前,它可以完成。将非空白留在输入流中并返回。
请注意(贷记为chux),使用行缓冲输入(通常,如果您不故意更改它,几乎总是这样),您需要输入这样的非空白,并在其后的某个地方添加一个返回/换行符。

请注意,如注释中所述,目标数组中需要4个字符的空格,以在字符串末尾也容纳始终写入的“ \ 0”。如果只有三个字符的空间,那么最后的0将被写入,而不会引起不确定的行为。

我不确定如何解决您的问题,因为我无法告诉您“ \ n”的目的。但是我认为,如果您将“ \ n”移出scanf()并可能移入printf(),则应该尝试这种行为。后面的scanf()调用以转换说明符(“ [”,“ c”和“ n”除外)开头,无论如何都会消耗任何前导空格,包括该行中所有剩余的换行符/返回值。