2016-07-28 70 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

相關問題