c-如何影响scanf中的字符串扫描



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

scanf("%3sn",array);
printf("%s",array);

我想知道的是:为什么在运行程序后,如果我在终端"abc"上写,为了让它打印出数组,我必须输入另一个输入,比如写另一个字母或数字?

如果我写"abcd",然后按ENTER,它会立即打印,但如果我只写"abc"并按ENTER多次,它仍然不会进入下一条指令(即printf(。

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

需要额外输入的不是printf(正如现在编辑的标题的第一个版本所暗示的那样(,而是scanf
您的格式字符串包含一个"n"
那恰好是一片空白
该位置的任何空白都会告诉scanf在三个字符(例如"abc"(后面使用任意数量的空白
只要您继续添加空白(包括返回(,scanf就不会消耗完"所有后面的空白">
只要输入任何非空格(例如"d"(,它就会知道"啊,所有空格都完成了"。然后,而不是之前,它可以完成。在输入流中保留非空白并返回
请注意(归功于chux(,对于行缓冲输入(通常,如果您没有故意更改,几乎总是如此(,您需要在某个位置输入这样一个非空白,并在其后面加上一个回车/换行符。

注意,正如注释中所提到的,在目标数组中需要4个字符的空间,以容纳字符串末尾始终写入的"\0"。如果您只有三个字符的空间,那么最后一个0将被写入,而不会导致未定义的行为。

我不知道如何解决你的问题,因为我不知道你的"的目的是什么。但我认为如果你把"从scanf()移到printf(),你应该试试这种行为。以下以转换说明符("["、"c"one_answers"n"除外(开头的scanf()调用无论如何都会消耗任何前导空格,包括该转换说明符的任何剩余换行符/返回符。

最新更新