2013-02-27 71 views
0
char *ptr=(char*)calloc(n,sizeof(int)); 

使用上面的方法,我們可以爲char數組分配內存。但是,它是逐字符強制性閱讀的​​%s`即字符串格式說明符?使用%s讀取char數組,即字符串說明符

+0

看起來你打算創建char數組,但第二個參數是'sizeof(int)'它應該是'sizeof(char)'。 – 2013-02-27 20:56:45

回答

0

是的,你可以使用%s來讀取這樣的數組,但是要確保你已經爲你嘗試讀取的內容分配了足夠的內存(不要忘記終止零字符!)。

2

逐字符讀取不是強制性的,正確使用%s容易出現緩衝區溢出。指定要讀取的最大字符數,比填充的緩衝區中的字節數少1,可防止緩衝區溢出。例如,"%10s"讀取最多十個字符,然後分配空終止字符,以便目標緩衝區至少需要11個字節。

然而,隨着代碼表明n使用%s動態寬度是在編譯時未知是不可能明確。但是,這將有可能構建格式說明(格式說明符不需要是一個字符串字面):

char fmt[32]; 
sprintf(fmt, "%%%ds", n - 1); /* If 'n == 10' then 'fmt == %9s' */ 
if (1 == scanf(fmt, ptr)) 
{ 
    printf("[%s]\n", ptr); 
} 

另一種方法是fgets()

if (fgets(ptr, n, stdin)) 
{ 
} 

但行爲稍有不同:

  • fgets()確實使用空格來終止輸入。
  • fgets()將存儲換行符,如果它遇到它。

鑄造的calloc()(或malloc()realloc())的返回值是不需要的(見Do I cast the result of malloc?)和張貼是混亂的,因爲它是用於int[n]分配空間,但意圖是字符數組。相反:

char* ptr = calloc(n, 1); /* 1 == sizeof(char) */ 

而且,如果一個空值終止字符串被讀入ptrcalloc()提供的初始化是多餘所以malloc()只就夠了:

char* ptr = malloc(n, 1); 

要記住,free()不管你malloc() d ,calloc() d或realloc() d。