2012-08-13 128 views
6

無論出於何種原因,下面的代碼打印(空):scanf函數動態分配

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char *foo; 
    scanf("%ms", &foo); 
    printf("%s", foo); 
    free(foo); 
} 

我試圖爲動態字符串分配內存,但正如我剛纔所說我的程序只是輸出(空)。我通過使用getche和realloc來創建一個函數來解決這個問題,但是由於我還必須編程如果用戶輸入退格鍵,選項卡等等時會發生什麼,所以它似乎幾乎毫無意義。但正如我所說的,這只是一個工作周圍,​​我寧願知道爲什麼上面的代碼是不工作...

附加信息:

我現在用的是PellesçIDE v7.00,並與C11標準編譯

+0

'%ms'打算做什麼? – 2012-08-13 00:18:44

+0

@Greg m標誌應動態分配內存以包含輸入。 – 2012-08-13 00:22:17

+3

這是不是標準?我沒有在我的'scanf'文檔中看到。 – 2012-08-13 00:23:17

回答

9

我不是見Draft C11 standard的第7.21.6.2節(fscanf部分)中的%m。我建議你避免它,並像在C99中一樣呼叫malloc()

+2

由於您無法預測使用'scanf(「%s」)分配多少空間,我還建議完全避免使用'scanf'並使用'fgets'和'sscanf '。 – jamesdlin 2013-04-16 18:10:16

+4

''%ms' notation是['scanf()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/scanf.html)中的一個POSIX擴展,與標準的C版本' scanf()'。 – 2013-11-11 00:02:46

0

%m是GNU擴展,這可能是爲什麼它不提供Pelles C.

+4

這是一個POSIX擴展,而不僅僅是一個GNU擴展 – 2013-11-11 00:01:41

0

我使用Linux 3.2.0 AMD 64 GCC 4.7.2。使用代碼:

char *s; 
scanf("%ms", &s); 
printf("%s", s); 
free(s); 

工作正常,但它不會接受空格。

對於靜態分配,您可以改用:

char s[100]; 
printf("Enter string (max 99 characters): "); 
scanf("%100[^\n]s", &s); 
printf("You entered: %s\n", s); 

希望它能幫助!

+0

對不起,但你不幫助他,因爲如果你看看你的'scanf()'函數,你一定會意識到這是錯誤的!它應該是'scanf(「%ms」,s)',因爲s本身就是一個指針!請諒解請注意,在's'之前沒有'&'。另外請記住,如果有任何問題,它將不能用於程序中的下一個'scanf'!希望它是明確的! – 2015-01-18 14:31:31

+3

@Meninx:不,使用'%ms',它應該是'scanf(「%ms」,&s)'。 POSIX'm'擴展名爲您分配字符串並將其分配給's',該''必須是'char *'類型。 – 2016-07-31 16:02:07

+1

@RudyVelthuis你是對的!感謝您指出! :) – 2016-07-31 16:10:59

0

Arun說,該解決方案是正確的,Meninx的觀點是錯誤的:

char *s; 
scanf("%ms", &s); 
printf("%s", s); 
free(s); 

我已經閱讀了 '人scanf函數',它說:

一個可選的 'M' 字。這用於字符串轉換(%s,%c,%[),
,並且減輕了調用者需要分配相應緩衝區到 保持輸入:相反,scanf()分配足夠大小的緩衝區,並且 這個緩衝器的地址分配給相應指針 論點,這應該是一個指向一個char *變量(此變量 不需要呼叫之前被初始化)。當這個緩衝區不再需要時,調用者應該隨後釋放(3)這個緩衝區。