使用%s读取char数组,即字符串说明符

时间:2013-02-27 14:32:47

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

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

使用上面的内容,我们可以为char数组分配内存。但是正在逐个字符地读取它? How to read and access it using%s`,即字符串格式说明符?

2 个答案:

答案 0 :(得分:2)

逐个字符读取不是强制性的,使用%s完全容易受到缓冲区溢出的影响。指定要读取的最大字符数,比正在填充的缓冲区中的字节数少一个,可防止缓冲区溢出。例如,"%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?),并且发布的内容令人困惑,因为它为{{分配了空间1}}但是打算成为字符数组。代替:

int[n]

此外,如果将{null}终止字符串读入char* ptr = calloc(n, 1); /* 1 == sizeof(char) */ ,则ptr提供的初始化是多余的,因此仅calloc()就足够了:

malloc()

请记住char* ptr = malloc(n, 1); free() d,malloc() d或calloc() d。

答案 1 :(得分:0)

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