从打印奇怪字符串的源复制字符串
Copying string from source printing strange string of characters
我正在制作一个词法分析器,但我无法将字符串从我的文件缓冲区复制到构造函数的字符串 属性。这是我用来从缓冲区复制字符串的代码。
static token_t* lexer_str(lexer_t* lexer) {
size_t str_len = 0;
while (true) {
if (lexer->len < 1) {
error_new(lexer->errors, lexer->len, lexer->pos, "Unterminated string.");
return NULL;
} else if (lexer_look(lexer, 0) == '\"') {
lexer_adv(lexer, 1);
break;
} else {
lexer_adv(lexer, 1);
str_len++;
}
}
char* string = malloc(str_len);
for (size_t idx = 0; idx < str_len; idx++)
string[idx] = lexer->src[lexer->ptr - str_len + idx];
token_t* token = token_new(lexer, _str);
token->string = string;
return token;
}
这里是缓冲区。
"la la la" "me me me"
这是输出,字符串显示为“²²²²\”
Type:0 {
Line: 1
Pos: 0
Number: 10715872
Real: 10715872
String: ²²²²\
}
为什么会这样?难道只是我从错误的地方读取内存。关于如何将字符串正确复制到令牌中的任何帮助都将适用。
首先char* string = malloc(str_len);
太短,你的字符串在复制后没有以null结尾(你复制了一个给定offset和len的缓冲区,缓冲区不包含结尾的null字符)
更改为:
char* string = malloc(str_len+1); // 1 byte more
for (size_t idx = 0; idx < str_len; idx++)
string[idx] = lexer->src[lexer->ptr - str_len + idx];
string[str_len] = '[=10=]'; // don't forget to null-terminate
如果源是空的,那么 string
中有一个非空终止字符串
我正在制作一个词法分析器,但我无法将字符串从我的文件缓冲区复制到构造函数的字符串 属性。这是我用来从缓冲区复制字符串的代码。
static token_t* lexer_str(lexer_t* lexer) {
size_t str_len = 0;
while (true) {
if (lexer->len < 1) {
error_new(lexer->errors, lexer->len, lexer->pos, "Unterminated string.");
return NULL;
} else if (lexer_look(lexer, 0) == '\"') {
lexer_adv(lexer, 1);
break;
} else {
lexer_adv(lexer, 1);
str_len++;
}
}
char* string = malloc(str_len);
for (size_t idx = 0; idx < str_len; idx++)
string[idx] = lexer->src[lexer->ptr - str_len + idx];
token_t* token = token_new(lexer, _str);
token->string = string;
return token;
}
这里是缓冲区。
"la la la" "me me me"
这是输出,字符串显示为“²²²²\”
Type:0 {
Line: 1
Pos: 0
Number: 10715872
Real: 10715872
String: ²²²²\
}
为什么会这样?难道只是我从错误的地方读取内存。关于如何将字符串正确复制到令牌中的任何帮助都将适用。
首先char* string = malloc(str_len);
太短,你的字符串在复制后没有以null结尾(你复制了一个给定offset和len的缓冲区,缓冲区不包含结尾的null字符)
更改为:
char* string = malloc(str_len+1); // 1 byte more
for (size_t idx = 0; idx < str_len; idx++)
string[idx] = lexer->src[lexer->ptr - str_len + idx];
string[str_len] = '[=10=]'; // don't forget to null-terminate
如果源是空的,那么 string