哦,这在c中是什么意思?

哦,这在c中是什么意思?,c,C,上面的格式非常奇怪,它在做什么?该行试图将不包含空格分隔的3个字符串读取到方法、url、协议中,如果读取3失败,则将进入if块。是一个从字符串读取数据并返回成功读取的项数的函数 因此,scanf将解析line以查找包含空格并由空格分隔的3个字符串,并将这3个字符串放入下面的3个变量中(method,url,protocol) 然后,如果它解析了3个参数,它将进入if块。该[]是扫描集。如果您告诉%[abcd],则将考虑仅带有a或b或c或d的输入字符串。字符串将在第一次出现大括号中任何字符以外的其

上面的格式非常奇怪,它在做什么?

该行试图将不包含空格分隔的3个字符串读取到方法、url、协议中,如果读取3失败,则将进入if块。

是一个从字符串读取数据并返回成功读取的项数的函数

因此,
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 )...