char *ptr=(char*)calloc(n,sizeof(int));
使用上面的方法,我們可以爲char數組分配內存。但是,它是逐字符強制性閱讀的%s`即字符串格式說明符?使用%s讀取char數組,即字符串說明符
char *ptr=(char*)calloc(n,sizeof(int));
使用上面的方法,我們可以爲char數組分配內存。但是,它是逐字符強制性閱讀的%s`即字符串格式說明符?使用%s讀取char數組,即字符串說明符
是的,你可以使用%s
來讀取這樣的數組,但是要確保你已經爲你嘗試讀取的內容分配了足夠的內存(不要忘記終止零字符!)。
逐字符讀取不是強制性的,正確使用%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) */
而且,如果一個空值終止字符串被讀入ptr
由calloc()
提供的初始化是多餘所以malloc()
只就夠了:
char* ptr = malloc(n, 1);
要記住,free()
不管你malloc()
d ,calloc()
d或realloc()
d。
看起來你打算創建char數組,但第二個參數是'sizeof(int)'它應該是'sizeof(char)'。 – 2013-02-27 20:56:45