2016-07-28 71 views
-5

有人能解释的含义,和c为什么这个语句在scanf语句中不需要'&'符号'scanf(“%* [ n]%[^ n]”,arr);'

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

这句话的工作?

+2

我投票结束这个问题作为题外话,因为发布完整的代码。 –

+4

一个更好的问题是告诉我们你的想法,你为什么这么想,如果程序的行为与你的期望不符,请以更明确的方式寻求具体的帮助。 –

+1

你需要看看如何声明'arr'。 – FredK

回答

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

+2

水晶球? “arr”无处宣告。 – Olaf

+0

是的,那个球......然而,阵列的大小在球上有些模糊,所以我只是猜到了99。 – anatolyg

相关问题