gpt4 book ai didi

c++ - scanf() 语句中的格式字符串 "%*[^\n]"指示什么?赋值抑制器 (*) 和否定扫描集 ([^) 如何一起工作?

转载 作者:行者123 更新时间:2023-12-02 05:51:21 25 4
gpt4 key购买 nike

我知道关于 [ 的扫描集的介绍转换说明符,随后指示与附加插入的 ^ 匹配或不匹配的字符符号。

为此,ISO/IEC 9899/1999 (C99) 中规定:

The characters between the brackets (the scanlist) compose the scanset, unless the character after the left bracket is a circumflex (^), in which case the scanset contains all characters that do not appear in the scanlist between the circumflex and the right bracket.

因此,表达式 [^\n]意味着它正在扫描字符,直到 \n在相应的流中找到字符,此处为 scanf() , stdin\n不是取自stdinscanf()如果还有剩余,则继续执行下一个格式字符串,否则将跳至下一个 C 语句。

接下来是赋值抑制运算符* :

为此,ISO/IEC 9899/1999 (C99) 中规定:

Unless assignment suppression was indicated by a *, the result of the conversion is placed in the object pointed to by the first argument following the format argument that has not already received a conversion result.

在 f.e. 的情况下的含义scanf("%*100s",a); 100 个字符的序列取自 stdin除非找到尾随空白字符但未分配给 a如果a是正确定义的char 101 个元素的数组 ( char a[101]; )。

<小时/>

但是现在格式字符串 "%*[^\n]" 的作用是什么?在 scanf() 语句中实现?是\n留在 stdin

如何分配抑制器*和否定扫描集[^一起工作吗?

这是否意味着:

  1. 通过使用 *与此格式字符串匹配的所有字符均取自 stdin ,但确定没有分配?,以及
  2. \n不是取自 stdin但它用于确定相应格式字符串的扫描操作?

我知道其中每一个 [^*单独做,但不一起做。问题是这两者混合在一起的结果是什么,并与 \n 的否定扫描集合并在一起。 .

<小时/>

我知道Stack Overflow上有一个类似的问题,其中涵盖了%[^\n]的理解只是,这里:What does %[^\n] mean in a scanf() format string 。但那里的答案并不能帮助我解决我的问题。

最佳答案

%[^\n] 读取但不包括下一个 \n 字符。用简单的英语来说,它读取一行文本。通常,该行将存储在 char * 字符串变量中。

char line[SIZE];
scanf("%[^\n]", line);

* 修饰符会抑制该行为。该行在读取后被简单地丢弃,并且不需要变量。

scanf("%*[^\n]");

* 不会改变输入的处理方式。无论哪种情况,从标准输入读取直到但不包括下一个 \n 的所有内容。假设没有 I/O 错误,则保证下次从 stdin 读取时将看到 \nEOF

Which scanf() statement should I use if I want to read and thereafter discard every character in stdin including the \n character?

添加 %*c 以同时使用 \n

scanf("%*[^\n]%*c");

为什么是 %*c 而不是 \n?如果您使用 \n 它不仅会消耗单个换行符,还会消耗任意数量的空格、制表符和换行符。 \n 匹配任意数量的空格。最好使用 %*c 来恰好消耗 1 个字符。

// Incorrect
scanf("%*[^\n]\n");

另请参阅:

Could I use fflush() instead?

不,不要。 fflush(stdin) is undefined.

Isn't the negated scanset of [\n] completely redundant because scanf() terminate the scan process of the according format string at first occurrence of a white space character by default?

使用%s,是的,它将在第一个空白字符处停止读取。 %s 只读取一个单词。相比之下,%[^\n] 读取整行。它不会停在空格或制表符处,只会停在换行符处。

更一般地说,对于方括号,只有列出的确切字符才是相关的。对于空白没有特殊的行为。与 %s 不同,它不会跳过前导空格,也不会在遇到空格时提前停止处理。

关于c++ - scanf() 语句中的格式字符串 "%*[^\n]"指示什么?赋值抑制器 (*) 和否定扫描集 ([^) 如何一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58589672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com