2010-08-30 70 views
3

我在mac os x上編譯C庫。當我輸入輸入和在屏幕上打印數據後,我沒有看到任何東西。mac上的scanf()存在問題

char *path = NULL; 
peerdisplay = "Bob"; 
printf("Insert the full 'To' path: "); 
scanf(" %a[^\n]", &path); 
printf("A path: %s \n", &path); 
 

當我將%a替換爲%s時,打印正常,但運行後出現分段錯誤。 我喜歡跑步,如腳本。

回答

2

%a是對scanf grabs的gnu特定的非標準擴展。什麼說你的OS X手冊關於它?

GNU C庫支持會使 庫動態地分配足夠大小的字符串輸入的字符串 爲%s和%A [範圍]轉換說明一個非標準擴展。要使用此功能的 ,請指定一個長度修飾符(因此%as或 %a [range])。來電者必須免費(3)返回的字符串

^是您的意圖嗎?

在這種情況下,如果該程序是用gcc編譯意識到

a改性劑是不可用 -std = C99或GCC -D_ISOC99_SOURCE(除非_GNU_SOURCE也是異型材 田間),在這種情況下,a被解釋爲用於浮點數的指定符(參見上文)。

2

您需要爲路徑分配內存。它需要足夠的內存來存放任何要輸入的字節,再加上NULL終止字節。

1

您的path是一個空指針,使它指向一些分配的內存足夠大,以容納要讀取的字符串和終止的字符。

您不應該將path的地址傳遞給scanfprintf,而是傳遞path本身。

既然你要掃描字符串中使用%s代替%a

1

首先,如果你傳遞一個空到scanf函數,你在這裏做,你基本上是告訴C庫複製任何字符串進入空間(也就是內存的第一頁,通常因爲這個原因而被禁止寫入)。其次,%a應該匹配一個浮點數,而不是一個字符串。第三,在開始調用庫函數之前,實際閱讀庫函數的文檔可能是一個好主意。