gpt4 book ai didi

c - C 中 `"%[^\n ]"` 和 `"%[^\n]\n "` and ` "%[^\n]%*c"` 之间的区别它们是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 16:35:10 27 4
gpt4 key购买 nike

我在其他任何地方都找不到答案。
%[^\n] - 当我运行这个时,scanf按回车键后正在输入和终止。 (可能在输入系统中留下 \n)
%[^\n]\n - 这个正在获取输入但是 scanf在我像上面那样按回车键后不会立即终止。我点击了更多的输入,它会产生更多的换行符。当我给出一个字符然后按回车键时它最终会终止。例子:

int main(void)
{
char s[100];

scanf("%[^\n]\n", s);

printf("%s", s);

return 0;
}

结果:

enter image description here

最后一个:
%[^\n]%*c - 当我给出一些输入并按回车键时。 scanf立即终止。

这三个是如何工作的,它们有什么不同?

最佳答案

所有 3 种格式都以 "%[^\n]" 开头."%[^\n]"是缺乏宽度限制并且容易受到缓冲区溢出的糟糕代码2。使用像 "%99[^\n]" 这样的宽度限制与 char s[100]; ."%[...]"不像许多其他说明符那样消耗前导空格。
此说明符指示读取输入直到 '\n' 1 遇到。 '\n'被放回 stdin .所有其他字符都保存在匹配目标的数组中 s .
如果没有读取任何字符(不包括 '\n' ),说明符失败并且 scanf()返回 没有 改变 s - 不使用其余格式。没有附加空字符。
如果读取了字符,它们将被保存并在 s 后附加一个空字符。并继续扫描格式的下一部分。
"\n"就像 " " , "\t" , "any_white_space_chracter"并读取并抛出 0 个或多个空白字符。它会继续这样做,直到读取非空白1。该非空白字符被放回 stdin .
给定行缓冲输入,这意味着需要在输入后面有一行非空格才能看到下一个非空格并允许 scanf()继续前进。
scanf() , "\n"格式的末尾是错误的,并导致了 OP 的问题。
"%*c"读取 1 个字符 1 并将其扔掉 - 即使它不是 '\n' .由于 '*',此说明符不影响返回计数。 .

更好的选择是使用 fgets() .

char s[100];
if (fgets(s, sizeof s, stdin)) {
s[strcspn(s, "\n")] = '\0'; // To lop off potential trailing \n
一个较小的选择是
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 IMO,比 gets() 差.

关于c - C 中 `"%[^\n ]"` 和 `"%[^\n]\n "` and ` "%[^\n]%*c"` 之间的区别它们是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62072127/

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