在C中读取字符串的详细信息?

时间:2016-11-15 18:23:47

标签: c scanf

有人可以解释这是如何工作的?我知道它读取一个字符串(带空格),但我并不完全理解背后的机制。有人可以解释 它一块一块地给我?

{{1}}

2 个答案:

答案 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变量中。

阅读手册页是你的朋友。我希望这有帮助。