scanf格式字符串中不同位置的空格有什么影响?

时间:2018-08-23 21:36:20

标签: c scanf

以下是我到目前为止所了解的。请确认,添加,视情况而定-

scanf (" %c %d %s", &a, &b, c);

在上面-%c之前的第一个空格可确保在scanf开始为此特定函数scanf调用从stdin接受新字符串之前清除缓冲区。这会清除以前输入函数调用中的所有定界符。

%d和%s前面的其余两个空格允许任意数量的空格或制表符,但不能在用户分别输入a,b和b,c之间输入按键。

即使采用上述方法,输入中也不能包含空格,即空格是三个输入中每个输入的定界符。要添加空格,必须在字符串控制括号[]中指定空格,例如“%[az A-Z_0-9]”,可以包含任何大写或小写字母,数字0-9,空格和下划线-但会处理所有其他字符均为无效字符-无效字符将转到格式字符串中的下一个输入(如果有),因此,如果上面的%[___]后接%c并按下了星号,则将星号放入对应的字符中%C。

请确认,更正,添加。谢谢。

2 个答案:

答案 0 :(得分:1)

来自cppreference.com

  

格式字符串中的任何单个空格字符都会消耗输入中所有可用的连续空格字符

因此,格式字符串中的所有空格仅表示跳过输入中的任何空格。

%c之前的空格与其他空格没有区别。初始空格不会清除缓冲区,它只会跳过输入中的任何初始空格。这样可以确保%c将读取输入中的第一个非空白字符。

空白包含空格,TAB和换行符。因此,您可以在每个输入之间放置空格或按Enter。

实际上%d%s之前不需要空格。这些格式不会读取任何包含空格的内容,它们会在读取对象之前自动跳过任何空格。格式字符串中的空格是多余的,没有害处,并且可能使它更易于阅读。

  

在尝试解析输入之前,除[cn以外的所有转换说明符都会消耗并丢弃所有前导空白字符(就像通过调用isspace来确定)。 />   ...
  可以通过使用格式字符串中的空格字符来使不使用前导空格的转换说明符(例如%c

答案 1 :(得分:0)

  

%c之前的第一个空格可确保在scanf开始为此特定函数scanf调用从stdin接受新字符串之前清除缓冲区。这会清除以前输入函数调用中的所有定界符。

不。没有清除缓冲区,没有分隔符。

  

%d和%s前面的其余两个空格允许任意数量的空格或制表符,但不能在用户分别输入a,b和b,c之间输入按键。

不。 Enter键将产生换行符,即空格。

  

即使采用上述方法,输入中也不能包含空格,即,空格是三个输入中每个输入的分隔符。

否。

  

无效字符将转到格式字符串中的下一个输入

是的。这不限于%[ ]:例如%d在输入流中看到12foo,它将消耗12并保留foo由其余的格式字符串读取(但是,如果没有前导数字,完全%d将失败并中止处理。


格式字符串中的任何空格字符都将读取并使用输入流中此时所有可用的空格字符,包括空格,制表符和换行符。空格是否出现在%c%d%s上都没关系:输入中的所有空格(包括换行符)都将被跳过。

%c可以接受空格。空格不是定界符,因为%c没有定界符;它总是读取一个字符。无法读取代码中空格的唯一原因是它在格式字符串中以开头,它将跳过所有可用的空白。

对于%d%s,它们隐式跳过前导空格。也就是说," %d"等效于"%d"" %s"等效于"%s"