-5
A
回答
2
让我们把它分解:
scanf("%*[\n]%[^\n]",arr);
%*[\n]
指导scanf函数来读取是'\n'
任何字符。 *
表示不保存任何内容。如果它不读取至少1个字符,则scanf()
将返回EOF。继续到EOF
或直到下一个字符不是'\n'
。
%[^\n]
指示scanf读取任何不是'\n'
的字符。这些值保存在arr
指示的内存中。这一直持续到下一个字符是'\n'
或发生EOF。如果没有读取字符,则返回0(或EOF)。如果至少一个被读取,并且没有错误,做的时候,一个\0
附加和scanf()
返回1
OP的代码不是好代码,因为没有输入的限制。以下会更好。使用fgets()
甚至更好。
char arr[10];
scanf("%*[\n]%9[^\n]",arr);
2
在C,scanf
常常用于填充char
阵列。也就是说,arr
是一个数组,声明如下:
char arr[99];
当作为参数传递给函数,it's converted to a pointer to first element供给。也就是说,scanf
收到一个指向数组的第一个元素的指针,就像它期望的格式说明符%[
一样。
顺便说一句,这是一个可能的缓冲区溢出的例子。本示例读取一行文本。如果行很长(在我的例子中大于98字节),scanf
会导致缓冲区溢出。您的示例实际上做了与gets
非常相似的操作,因为它可能会导致超限(并且无法防止),因此已弃用。如所描述的那样使用您的格式的边界。 here。
相关问题
- 1. Scanf语句
- 2. scanf()在if语句中不起作用
- 3. 为什么我的scanf语句中的空格有所作为?
- 4. scanf说明符“n”是什么数字?
- 5. 这是什么意思“scanf(”%[^ \ n]“,buf);” ?它的等价C++语法是什么?
- 6. 为什么“int arr [n];”当索引“n”稍后要被scanf()输入时,导致我的程序挂起?
- 7. 为什么python中的try语句需要else子句?
- 8. 为什么&在这个if语句中?
- 9. scanf(“%[^ \ n]”)被跳过
- 10. 为什么在scanf中不需要address操作符?
- 11. INSERT语句后需要什么?
- 12. 为什么我不需要括号for循环和if语句
- 13. 为什么这个scanf返回false?
- 14. 什么是更准确的平均方法,ARR [0]/N + ARR [1]/N ... + ARR [N-1]/N或(ARR [0] + ARR [1] ... + ARR [N-1])/ N为双倍?
- 15. select语句:N的关系
- 16. 这条语句(line,str)= str.split(“\ n”,1)是什么意思?
- 17. 什么%[^ \ n]的意思是在scanf()的格式字符串
- 18. 问题的scanf( “%d \ n”,&I)
- 19. 为什么这个if语句失败?
- 20. 为什么这个'if'语句循环?
- 21. 为什么这个if语句引起
- 22. 为什么在我的SQL语句中插入两个表中需要分号?
- 23. 为什么scanf不需要字符串的&符号,并且在printf中(在C中)也能正常工作?
- 24. 这个if语句有什么不对?
- 25. 为什么return语句不能在else语句中工作
- 26. 变化在scanf C语言
- 27. 为什么这个嵌套的switch语句不起作用? (C++)
- 28. 为什么不会让java让我有这个else语句?
- 29. 为什么这些语句需要不同的时间在R中运行?
- 30. 我需要做些什么来纠正这个SQL语句?
我投票结束这个问题作为题外话,因为发布完整的代码。 –
一个更好的问题是告诉我们你的想法,你为什么这么想,如果程序的行为与你的期望不符,请以更明确的方式寻求具体的帮助。 –
你需要看看如何声明'arr'。 – FredK