gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:20:49 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com