char *ptr=(char*)calloc(n,sizeof(int));
利用上面的内容,我们可以为 char 数组分配内存。但是必须逐个字符地读取吗?如何使用
%s`(即字符串格式说明符)读取和访问它?
最佳答案
逐字符读取不是强制性的,并且精确地使用 %s
容易受到缓冲区溢出的影响。指定要读取的最大字符数(比正在填充的缓冲区中的字节数少 1)可防止缓冲区溢出。例如"%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? ),并且发布的内容令人困惑,因为它为 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.
关于c - 使用 %s(即字符串说明符)读取 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114648/