char *ptr=(char*)calloc(n,sizeof(int));
使用上述方法,我们可以为 char 数组分配内存。但是是否逐个字符地阅读它是强制性的? How to read and access it using
%s` 即字符串格式说明符?
char *ptr=(char*)calloc(n,sizeof(int));
使用上述方法,我们可以为 char 数组分配内存。但是是否逐个字符地阅读它是强制性的? How to read and access it using
%s` 即字符串格式说明符?
逐个字符读取不是强制性的,并且精确使用%s
容易受到缓冲区溢出的影响。指定要读取的最大字符数,比正在填充的缓冲区中的字节数少一,防止缓冲区溢出。例如"%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()
不需要强制转换(or malloc()
or 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。
是的,您可以使用读取此类数组,%s
但请确保已为尝试读取的内容分配了足够的内存(不要忘记终止的零字符!)。