什么是scanf("%*[\n]%[^ \n]",input_string); 做?

bac*_*her 1 c string scanf

我无法理解其中的差异.我使用%[^\n]s,用于从用户输入短语.但是当我需要添加两个短语时,这不起作用.但上面的确如此.请帮我理解差异.

ex *_*ilo 7

%[\n]指令告诉scanf()匹配换行符,并*没有分配应作出标志信号,所以%*[\n]在任何领先的换行符跳过(假设至少一个主要\n角色:更多关于这一会儿).在第一个指令后面有一个空格,因此在final %[^\n]指令之前跳过零个或多个空格字符,它匹配字符直到遇到换行符.这些存储在input_string[],输入流中留下换行符.使用此格式字符串的后续调用将跳过此剩余的换行符.

但是,这里可能没有必要使用这个%*[\n]指令,因为它\n是一个空白字符; 使用格式字符串中的前导空格几乎可以完成同样的事情:" %[^\n]".

两者之间的一个区别是:"%*[\n] %[^\n]" 期望在输入的开头有一个换行符,如果没有这个,匹配失败并scanf()返回而不进行任何赋值," %[^\n]"而不期望领先换行符,甚至是前导空白字符(但跳过它们)如果存在).

如果您使用了"%[^\n]",如问题正文中所建议的(请注意尾部s不是scanset指令的一部分),第一次调用scanf()将匹配字符,直到遇到换行符.匹配的字符将被存储input_string[],并且换行将保留在输入流中.然后,如果scanf()使用此格式字符串再次调用,则在遇到换行符之前不会匹配任何字符,因此匹配将在没有赋值的情况下失败.

请注意,使用的时候你应该总是指定一个最大宽度%s%[]scanf()格式字符串,以避免缓冲区溢出.使用%s或者%[],scanf()自动添加\0终结符,因此您必须确保为此留出空间.对于大小为100的数组,最大宽度应为99,因此在添加空终止符之前,最多匹配99个字符并存储在数组中.例如:" %99[^\n]".