`";%之间的差异[^\n]“`和`";%[^\n]\n";`和`";%[^\n]%*c";`在C语言中,它们是如何工作的?
我在其他任何地方都找不到答案`";%之间的差异[^\n]“`和`";%[^\n]\n";`和`";%[^\n]%*c";`在C语言中,它们是如何工作的?,c,input,scanf,C,Input,Scanf,我在其他任何地方都找不到答案 %[^\n]-当我运行此程序时,scanf正在获取输入,并在我按enter键后终止。(可能将\n留在输入系统中) %[^\n]\n-这一个正在获取输入,但在我按enter键后,scanf不会立即终止,就像上面的一样。我点击了更多的回车键,它生成了更多的换行符。当我给出一个字符,然后按enter键时,它最终终止。例如: int main(void) { char s[100]; scanf("%[^\n]\n", s); printf("%
%[^\n]
-当我运行此程序时,scanf
正在获取输入,并在我按enter键后终止。(可能将\n
留在输入系统中)
%[^\n]\n
-这一个正在获取输入,但在我按enter键后,scanf
不会立即终止,就像上面的一样。我点击了更多的回车键,它生成了更多的换行符。当我给出一个字符,然后按enter键时,它最终终止。例如:
int main(void)
{
char s[100];
scanf("%[^\n]\n", s);
printf("%s", s);
return 0;
}
结果:
最后一个:
%[^\n]%*c
-当我输入一些内容并按enter键时scanf
立即终止
这三种格式的工作原理和区别是什么?所有这三种格式都以
“%[^\n]”
开头
“%[^\n]”
是一种糟糕的代码2,它缺少宽度限制,并且容易发生缓冲区溢出。使用宽度限制,如%99[^\n]“
和字符[100]代码>
“%[…]”
不像其他许多说明符那样使用前导空格
此说明符指示读取输入,直到遇到'\n'
1。'\n'
被放回stdin
。所有其他字符都保存在匹配目标的数组s
中
如果未读取任何字符(不计算'\n'
),则说明符将失败,scanf()
返回,而不更改s
-不使用格式的其余部分。没有附加空字符
如果读取了字符,则会保存这些字符,并在s
后追加一个空字符,然后继续扫描格式的下一部分
“\n”
的作用类似于“
”、“\t”
、“任意空白字符”
,并读取和抛出0个或更多空白字符。它将继续执行此操作,直到读取非白色空格1。该非空白字符被放回stdin
给定行缓冲输入,这意味着需要在输入之后有一个非空白的行来查看下一个非空白并允许scanf()
继续
使用scanf()
,格式末尾的“\n”
不正确,导致OP出现问题
“%*c”
读取1个字符1并将其丢弃-即使它不是“\n”
。由于“*”
,此说明符不参与返回计数
更好的选择是使用fgets()
一个较小的选择是
char s[100] = { 0 };
scanf("%99[^\n]", s);
// With a separate scanf ....
scanf("%*1[\n]"); // read the next character if it is a \n and toss it.
1。。。或文件结尾或罕见的输入错误
2在我看来,比。aa更糟糕。是的,但我想知道这三个选项是如何工作的,我想知道它们背后的逻辑。为什么他们会这样做,可能重复:
char s[100] = { 0 };
scanf("%99[^\n]", s);
// With a separate scanf ....
scanf("%*1[\n]"); // read the next character if it is a \n and toss it.