[我知道使用[
转换说明符引入了扫描集,该转换说明符随后指示与^
符号的附加插入字符匹配或不匹配的字符。
为此,在ISO / IEC 9899/1999(C99)中声明:
括号之间的字符(扫描列表)构成了扫描集,除非左括号后面的字符是抑音符(^),在这种情况下,扫描集包含了在抑扬音符和右侧之间在扫描列表中未出现的所有字符。括号。
因此,表达式[^\n]
表示它正在扫描字符,直到在相应的流(此处为\n
,scanf()
)中找到stdin
字符为止。 \n
不是从stdin
中获取的,并且scanf()
继续使用下一个格式字符串(如果还有),否则将跳至下一个C语句。
下一个是分配抑制运算符*
:
为此,在ISO / IEC 9899/1999(C99)中声明:
除非用*指示分配抑制,否则转换结果将放置在尚未接收转换结果的format参数后面的第一个参数指向的对象中。
f.e。 scanf("%*100s",a);
如果stdin
是101个元素的正确定义的a
数组,则从a
中获取100个字符的序列,除非找到结尾的空格字符,但未将其分配给char
])。
但是现在scanf()语句中的格式字符串char a[101];
实现了什么?
"%*[^\n]"
中还剩下什么字符?
这是否意味着:
stdin
,所有与此格式字符串匹配的字符都取自*
,但确保未分配?,和stdin
不是从\n
中获取的,但是它用于确定相应格式字符串的扫描操作吗?[我知道在Stackoverflow上有一个类似的问题,仅涵盖对stdin
的理解,这里:[^\n]
,但是那里的答案对我的问题没有帮助。
What does %[^\n] mean in a scanf() format string最多读取但不包括下一个%[^\n]
字符。用普通的英语,它读一行文本。
通常,该行将存储在\n
字符串变量中,但是char *
修饰符会抑制该行为。该行在读取后被简单丢弃。如果不存在,则必须有一个存储行的位置:
*
char line[SIZE];
scanf("%[^\n]", line);
不需要变量。
*