我有这段代码:
sscanf ("45 , ignore_this % C read_in_this**", "%d , %*s %% %c %5s %s",
&i, &c, string, &string[5]);
当我查看变量赋值时,我得到了
c = C
i = 45
string = read_in_this**
string + 5 = in_this**
我对如何分配&i
,&c
,string
和&string[5]
感到困惑。我的逐步解释/问题:
&i
- > %d
- > “45”%*s
,因此忽略“ignore_this”。%%
?为什么&c
没有分配到%%
?输入字符串中的“%”会发生什么?&c
- > %c
- > “C”string
- > %5s
- > “read_in_this **”但是'5'的重点是什么?为什么它不能只是%s
? 不确定&string[5]
的作用。
string + 5
到底做了什么?
真的很感激帮助。谢谢!
答案 0 :(得分:2)
在*scanf
中,空白字符占用所有空格,%
启动转换说明符。格式中的其他字符必须与输入1对1匹配。 %%
与输入中的%
匹配。
因此:
%d
从输入(45)转换十进制整数,并将其存储到i
。
吃空格%*s
解析并丢弃由空格分隔的字符串(ignore_this
),
与逗号匹配
吃空格%c
读取一个字符,将其存储到char
- 此处'C'
,存储到c
再次吃白色空间现在此时剩余的输入为read_in_this**
。转换说明符%5s
解析最多5个字符长的空格分隔字符串 - 这里它将匹配read_
;这些字符将存储在string[0]
... string[4]
; string[5]
将收到字符串终止\0
。剩下的输入是in_this**
。现在将丢弃任何空格(没有任何空格,因此不会丢弃任何空格)。
最后,最后一个%s
将以空格分隔的字符串in_this_**
读取,并将其存储到从<{1}}的地址启动的内存中 - 即用string[5]
覆盖终止空字符 - 依此类推。您可以试验如果将i
替换为&string[5]
,将会发生什么。