char *ptr=(char*)calloc(n,sizeof(int));
使用上面的内容,我们可以为char数组分配内存。但是正在逐个字符地读取它? How to read and access it using
%s`,即字符串格式说明符?
答案 0 :(得分:2)
逐个字符读取不是强制性的,使用%s
完全容易受到缓冲区溢出的影响。指定要读取的最大字符数,比正在填充的缓冲区中的字节数少一个,可防止缓冲区溢出。例如,"%10s"
最多读取10个字符,然后分配空终止字符,以便目标缓冲区至少需要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?),并且发布的内容令人困惑,因为它为{{分配了空间1}}但是打算成为字符数组。代替:
int[n]
此外,如果将{null}终止字符串读入char* ptr = calloc(n, 1); /* 1 == sizeof(char) */
,则ptr
提供的初始化是多余的,因此仅calloc()
就足够了:
malloc()
请记住char* ptr = malloc(n, 1);
free()
d,malloc()
d或calloc()
d。
答案 1 :(得分:0)
是的,您可以使用%s
读取此类数组,但请确保为您尝试读取的内容分配了足够的内存(不要忘记终止零字符!)。