0
char *ptr=(char*)calloc(n,sizeof(int));

使用上述方法,我们可以为 char 数组分配内存。但是是否逐个字符地阅读它是强制性的? How to read and access it using%s` 即字符串格式说明符?

4

2 回答 2

2

逐个字符读取不是强制性的,并且精确使用%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。

于 2013-02-27T14:47:56.127 回答
0

是的,您可以使用读取此类数组,%s但请确保已为尝试读取的内容分配了足够的内存(不要忘记终止的零字符!)。

于 2013-02-27T14:34:48.463 回答