哦,这在c中是什么意思?
上面的格式非常奇怪,它在做什么?该行试图将不包含空格分隔的3个字符串读取到方法、url、协议中,如果读取3失败,则将进入if块。是一个从字符串读取数据并返回成功读取的项数的函数 因此,哦,这在c中是什么意思?,c,C,上面的格式非常奇怪,它在做什么?该行试图将不包含空格分隔的3个字符串读取到方法、url、协议中,如果读取3失败,则将进入if块。是一个从字符串读取数据并返回成功读取的项数的函数 因此,scanf将解析line以查找包含空格并由空格分隔的3个字符串,并将这3个字符串放入下面的3个变量中(method,url,protocol) 然后,如果它解析了3个参数,它将进入if块。该[]是扫描集。如果您告诉%[abcd],则将考虑仅带有a或b或c或d的输入字符串。字符串将在第一次出现大括号中任何字符以外的其
scanf
将解析line
以查找包含空格并由空格分隔的3个字符串,并将这3个字符串放入下面的3个变量中(method
,url
,protocol
)
然后,如果它解析了3个参数,它将进入
if
块。该[]
是扫描集。如果您告诉%[abcd]
,则将考虑仅带有a或b或c或d的输入字符串。字符串将在第一次出现大括号中任何字符以外的其他字符时终止
^
内的[]
用于表示大括号内集合的补充。与格式字符串类似,%[^abcd]
只接受除a、b、c或d以外的所有字符
因此,在%[^]
中,后跟^
的空格表示格式字符串将接受字符串中没有空格的任何字符组合
格式字符串“%[^]%[^]]%[^][^]”
将匹配由空格分隔的三个组件组成的字符串。每个组件将包含一个字符序列,其中没有空格
该函数返回成功匹配和分配的输入项的数量,该数量可以小于提供的数量,如果早期匹配失败,甚至可以为零
因此,仅当且仅当读取所有三个组件时,上述函数才会返回
3
,也就是说,输入行有三个分区,对于每个分区,填充了三个数组method
,url
和protocol
。[规范应具有固定宽度以避免缓冲区溢出:…sscanf(行,“%19[^]%19[^]%19[^]%19[^]”,…
,假设数组为20chars@pmg:作为回答,我们会投票支持你。没关系@Vlad:upvotes的评论也很好,thanks@pmg,这种格式仅为sscanf
,在printf中不可用,对吗?@compile fan:它在printf
printf(“%.18s”,astring)中的工作方式有所不同
打印astring
的前18个字符,如果长度超过该字符,则使用3个扫描集,每个扫描集带有%[^]字符,^表示不包含以下字符,后面跟一个空格。例如%[^abc]将扫描所有内容,直到找到a、b或c字符。它是否适用于由多个空格分隔的3个字符串?是的,只要在第一次出现之前没有空格,请尝试此示例const char*line=“post google.com http”;char方法[5],url[11],协议[5];printf(“%d%s%s:/%s\n”),sscanf(行,“%4[^]%10[^]%4[^]”,方法,url,协议),方法,协议,url);
请记住,正如pmg上面所说的那样,使用固定的宽度。这些评论去掉了空格,但只是在post google.com和http之间添加了额外的空格。
if ( sscanf( line, "%[^ ] %[^ ] %[^ ]", method, url, protocol ) != 3 )...