有人可以解释这是如何工作的?我知道它读取一个字符串(带空格),但我并不完全理解背后的机制。有人可以解释 它一块一块地给我?
{{1}}
答案 0 :(得分:3)
db.addCollection('contents', {unique: ['id', 'wsID']});
这表示“读取所有内容直到换行符,然后读取一个字符”。 scanf("%[^\n]%*c",string);
(在*
中)是要禁止分配。这就是它读取一行并消耗换行符。
来自scanf()
:
可选的'*'赋值抑制字符:scanf()读取 按照转换规范的指示输入,但丢弃 输入。没有相应的指针参数,这个 规范不包括在成功分配的计数中 由scanf()返回。
但是,对于阅读行,我会改为使用fgets()
并在之后使用尾随换行符。
%*c
这是less error prone,最好理解。
如果您使用的是glibc,也可以使用getline()
。
答案 1 :(得分:2)
从手册页:
所有转化均由%(百分号)字符
引入
转化是我们如何匹配某些文字字符串。例如,%s
匹配字符串,%d
匹配十进制整数。因此,查看您的字符串,我们进行了"%[
转换,根据手册页:
[匹配指定的一组接受字符中的非空字符序列; ...集合由开括号[字符和近括号]字符之间的字符定义。
因此,此转换将定义一个字符列表,这些字符将匹配并读入您的字符串。重要的是:
如果开括号后面的第一个字符是旋律^,则该集将排除这些字符。
如果你查看你的字符串"%[^\n]%*c"
,你就会得到%[^\n]
,这意味着你匹配任何字符,直到你遇到换行符。
接下来,您有一个%*
星标是忽略之后匹配的转化。从手册页:
禁止转让。随后的转换照常发生,但没有使用指针;转换的结果就被丢弃了。
所以,如果你看一下你的最后一场比赛,你就得到了c
,
c匹配一系列宽度计数字符(默认值为1);
所以%*c
表示你要匹配1个字符,然后丢弃它(匹配的字符是换行符 - %[^\n]
没有消耗,因为你匹配了所有内容< em>最多该换行符),它不会存储在您的string
变量中。
阅读手册页是你的朋友。我希望这有帮助。