c - 什么是 scanf ("%*[\n] %[^\n]", input_string);做?

标签 c string scanf

我无法理解其中的区别。我使用 %[^\n]s 来获取用户输入的短语。但是当我需要添加两个短语时,这不起作用。但是上面那个做到了。请帮助我了解其中的区别。

最佳答案

%[\n]指令告诉scanf()匹配换行符,*标志表示不应进行分配,因此 %*[\n]跳过任何前导换行符(假设 至少有一个前导 \n 字符:稍后会详细介绍)。在第一个指令之后有一个空格,因此在最后一个 %[^\n] 之前会跳过零个或多个空白字符。指令,匹配字符直到遇到换行符。这些存储在 input_string[] 中, 换行符留在输入流中。使用此格式字符串的后续调用将跳过剩余的换行符。

但是,可能不需要 %*[\n]指令在这里,因为 \n是一个空白字符;使用格式字符串中的前导空格几乎可以完成相同的事情:" %[^\n]" .

两者的区别之一:"%*[\n] %[^\n]" 期望在输入的开头有一个换行符,如果没有这个匹配失败并且scanf()返回时不做任何赋值,而 " %[^\n]"不期望前导换行符,甚至是前导空白字符(但如果存在则跳过它们)。

如果您使用了 "%[^\n]"相反,正如问题正文中所建议的那样(请注意尾随的 s 不是 scanset 指令的一部分),第一次调用 scanf()将匹配字符,直到遇到换行符。匹配的字符将存储在 input_string[] 中,换行符将保留在输入流中。然后,如果scanf()使用此格式字符串再次调用,在遇到换行符之前不会匹配任何字符,因此如果没有赋值,匹配将失败。

请注意,使用 %s 时应始终指定最大宽度或 %[]scanf()格式化字符串以避免缓冲区溢出。使用 %s 中的任何一个或 %[] , scanf()自动添加 \0终结器,因此您必须确保为此留出空间。对于大小为 100 的数组,最大宽度应为 99,以便在添加空终止符之前最多匹配并存储 99 个字符到数组中。例如:" %99[^\n]" .

关于c - 什么是 scanf ("%*[\n] %[^\n]", input_string);做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45278383/

相关文章:

c++ - fpga:选择c++来编程fpga

string - 将字符视为变量

string - 如何在 Swift 中将字符串替换为字符串?

c - scanf 不接收数据

c - Makefile 没有使用正确的常量?

c++ - C/C++ 中的非保留字符

c++ - 将代码从 C 转换为 C++ : typedef void and <unresolved overloaded function type>

C++:一般来说,我应该使用字符串还是字符数组?

c - 我正确使用 fscanf 吗?和 switch 语句?

c - scanf 的问题