Cha*_*ase 7 c scanf visual-studio-2017
我对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);
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我使用VS-2017编译它时,我得到这些错误 -
source.c(10):警告C4473:'scanf_s':没有为格式字符串传递足够的参数
source.c(10):注意:占位符及其参数需要2个可变参数,但提供了1个
source.c(10):注意:格式字符串'%c'需要缺少的可变参数2
source.c(10):注意:此参数用作缓冲区大小
我认为动态分配内存(如上面的代码)应该可行,但我可能做错了.有没有办法让这项工作?
编辑:Word.
getchar不scanf_sint ch;不char ch;应该使用EOF以下方法code可能有效:
#include<stdio.h>
#include<stdlib.h>
int main() {
char *str = NULL;
int ch;
size_t size = 0, len = 0;
while ((ch=getchar()) != EOF && ch != '\n') {
if (len + 1 >= size)
{
size = size * 2 + 1;
str = realloc(str, sizeof(char)*size);
}
str[len++] = ch;
}
if (str != NULL) {
str[len] = '\0';
printf("%s\n", str);
free(str);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)