有人可以解释这句C语言的含义和工作吗?
scanf( "%*[\n]%[^\n]",arr);
答案 0 :(得分: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);
答案 1 :(得分:2)
在C中,scanf
通常用于填充char
数组。也就是说,arr
是一个数组,声明如下:
char arr[99];
作为函数的参数提供时,it's converted to a pointer to first element。也就是说,scanf
接收指向数组第一个元素的指针,就像它期望的%[
格式说明符一样。
BTW这是可能的缓冲区溢出的一个例子。此示例读取一行文本。如果行很长(在我的示例中大于98个字节),scanf
将导致缓冲区溢出。您的示例实际上与gets
非常相似,因为它可能导致超出(以及无法阻止),因此不推荐使用。here。使用您的格式的边界,例如, {{3}}