【发布时间】:2018-11-02 09:54:44
【问题描述】:
我对 C 中的字符串有点困惑。我知道声明缓冲区大小很重要,否则会导致缓冲区溢出。但我需要知道如何获取我不知道大小的字符串输入。例如,如果我想从用户那里获取一行文本作为输入,但我无法知道他们的文本会有多长,我该怎么做?
我尝试在用户输入时动态分配内存。这是代码-
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *str, ch;
int size = 10, len = 0;
str = realloc(NULL, sizeof(char)*size);
if (!str)return str;
while (EOF != scanf_s("%c", &ch) && ch != '\n')
{
str[len++] = ch;
if (len == size)
{
str = realloc(str, sizeof(char)*(size += 10));
if (!str)return str;
}
}
str[len] = '\0';
printf("%s\n", str);
free(str);
}
问题是,当我使用 VS-2017 编译它时,我得到了这些错误-
source.c(10): 警告 C4473: 'scanf_s' : 没有足够的参数传递 对于格式字符串
source.c(10): 注意:占位符及其参数需要 2 可变参数,但提供了 1 个
source.c(10):注意:缺少的可变参数 2 是必需的 格式化字符串'%c'
source.c(10): 注意:此参数用作缓冲区大小
我认为动态分配内存(如上面的代码)应该可以工作,但我可能做错了什么。有没有办法让这个工作?
编辑:字。
【问题讨论】:
-
此处不要使用
scanf,而应使用getc。 -
并且不要使用 C 标准附录 K 中的
scanf_s()或任何其他*_s()函数。如果正确使用标准的 C 函数,它们并不比标准 C 函数更安全,and the*_s()functions are not portable as implemented by Microsoft:“由于与规范存在大量偏差,因此不能认为 Microsoft 实现符合或可移植。”
标签: c visual-studio-2017 scanf