c - 如何输入大小未知的字符串
问题描述
我对 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):注意:格式字符串 '%c' 需要缺少的可变参数 2
source.c(10):注意:此参数用作缓冲区大小
我认为在我继续进行时动态分配内存(如上面的代码)应该可以工作,但我可能做错了什么。有没有办法使这项工作?
编辑:字。
解决方案
getchar
你不应该使用scanf_s
- 你不
int 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;
}
推荐阅读
- flutter - Flutter:将数据放入第二个菜单时,dropdown_formfield 0.1.1 插件出现问题
- javascript - CSS 排除级联类
- ios - Swift - 自定义大小的 UITableViewCell 中的 UICollectionView 分页
- python - 鼠兔频道在一段时间后停止消耗
- google-cloud-platform - 在 Google BigQuery 中更改计划查询的显示名称
- module - Yocto 加载内核模块
- mongodb - MongoDB 中的 MapReduce - 按类别计数
- javascript - 如何将坐标数据从一个类传递到 React 中的另一个类
- erp - 如果 PO 项目交叉引用到 Job In infor syteline,是否有任何方法可以自动接收采购订单?
- python - 将 Glue ETL 作业加载到雪花中时出错