c - 使用 %s(即字符串说明符)读取 char 数组

标签 c arrays char dynamic-memory-allocation format-specifiers

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/

相关文章:

Char* 数组不保留值 C

java - 将列表中的单个字符串按字母顺序排列 - Java

c - 线程函数中的字符串参数

c - 在没有 malloc、brk 或 mmap 的情况下,BareMetalOS 如何在 Assembly 中分配内存?

c - 我在 C 上读取字符时出错

c# - 将具有随机唯一数字的数组转换为具有连续数字的数组?

javascript - 使用闭包进行多项选择的数组过滤器函数 - Javascript

php - 通过数组值的键路径设置多维数组?

arrays - 将函数应用于 SELECT 语句中数组的每个元素

c++ - 将值存储在 char 指针指向的 char 数组中