c - 如何将字符收集到 C 中的字符串中?
问题描述
我需要为我的词法分析器收集一些字符到缓冲区中,但我不知道如何。我已经阅读了有关 stackoverflow 的一些答案,但这些是不同的情况。我有一个读取下一个字符的 while 循环,我想将逻辑放入其中,以便将新字符附加到内存中的缓冲区。
// init buffer with the first char 'h'
char *buffer = malloc(sizeof(char));
buffer[0] = 'h';
buffer[1] = '\0';
// go through input char by char
while(...)
{
char c = read_next_char();
buffer.append(c) // I whould do in JavaScript, but not in C :(
}
解决方案
char *buffer = malloc(sizeof(char));
在您的情况下,您在开头分配一个字节并访问缓冲区 [1] 或任何其他索引是 UB。
您可以在开始时分配已知数量的字节并使用它,直到您看到需要更多缓冲区大小的点。
像这样的东西,
int buffersize = 100;
int index =0;
char *buffer = malloc(sizeof(char)*buffersize); //100bytes are allocated
if(!buffer)
return;
buffer[index++] = 'h';
buffer[index++] = '\0';
// go through input char by char
while(...)
{
char c = read_next_char();
if(index == buffersize ){
buffersize +=100;
buffer= realloc(buffer, buffersize );
//here buffer size is increased by 100
if(!buffer)
return;
}
buffer[index++] = c ;
}
注意:buffer
一旦使用结束,您必须释放它,否则会导致资源泄漏。
推荐阅读
- javascript - 为什么 mouserover 在回调中返回所有数据
- javascript - Angular StaticInjectorError
- python - Python:for循环中的索引字典
- android - AccelerateInterpolator 同步状态
- php - htaccess url 重写和 PHP $_GET['id'] 问题
- directx - 包含错误:“无法打开源文件“d3dx9.h”
- javascript - Jquery自动完成对象传递
- firebase - 从 Firebase 控制台检索注册令牌
- android - Android - MVVM 中 ViewModel 状态的最佳实践?
- html - Flexbox,如何在 400px 处保持至少 2 列?