if ( sscanf( line, "%[^ ] %[^ ] %[^ ]", method, url, protocol ) != 3 )...
上述格式非常奇怪,它在做什么?
答案 0 :(得分:7)
该行试图将3个不包含空格的空格分别读入方法,网址,协议,如果无法读取3,则输入if块。
答案 1 :(得分:3)
[]
是扫描集。如果您告诉%[abcd]
,那么仅使用 a 或 b 或 c 或 d 的输入字符串将被考虑。该字符串将在第一次出现时终止于不大括号中的任何字符。
^
内的[]
用于表示大括号内的集合的补充。与格式字符串%[^abcd]
一样,只接受除, a 或 b 或 c 之外的所有字符或 d 。
所以在%[^ ]
中,空格后跟^
告诉我,格式字符串将接受不>的字符串中的任何字符组合em>有一个空白。
格式字符串"%[^ ] %[^ ] %[^ ]"
将匹配一个字符串,该字符串具有由空格分隔的三个组件。每个组件都包含一系列字符,其中没有空格。
该函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
因此,只有当且仅当读取了所有三个组件时,上述函数才会返回3
,也就是说,输入行有三个分区,并且对于每个分区,三个数组method
,{{填充了1}}和url
。
答案 2 :(得分:0)
scanf是一个从字符串中读取数据并返回成功读取的项目数的函数。
因此,scanf
将解析line
以找到包含空格的3个字符串并用空格分隔,并将这3个字符串放在后面的3个变量中(method
,{ {1}},url
)。
然后,如果它解析了3个参数,它将进入protocol
块。