为什么这句话不需要'&' scanf语句中的符号' scanf("%* [\ n]%[^ \ n]",arr);'

时间:2016-07-28 17:36:02

标签: c

有人可以解释这句C语言的含义和工作吗?

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

2 个答案:

答案 0 :(得分:2)

让我们分解一下:

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

%*[\n]指示scanf读取 '\n'的所有字符。 *表示不保存任何内容。如果它没有读取至少1个字符,scanf()将返回EOF。继续,直到EOF或直到下一个字符不是'\n'

%[^\n]指示scanf读取任何不是'\n'的字符。这些值保存在arr指示的内存中。这将继续,直到下一个字符'\n'或EOF出现。如果未读取任何字符,则返回0(或EOF)。如果至少读过一个,并且没有错误,则完成后会附加\0scanf()会返回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}}