【问题标题】:Copying string from source printing strange string of characters [closed]从源打印奇怪的字符串复制字符串[关闭]
【发布时间】:2016-08-05 21:47:39
【问题描述】:

我正在制作一个词法分析器,但我无法将一个字符串从我的文件缓冲区复制到构造函数的字符串属性。这是我用来从缓冲区复制字符串的代码。

    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: ²²²²\
}

为什么会这样?难道只是我从错误的地方读取记忆。任何关于我如何正确地将字符串复制到令牌中的帮助都会被应用。

【问题讨论】:

标签: c string lexer


【解决方案1】:

第一个char* string = malloc(str_len); 太短,并且你的字符串在复制后不是空终止的(你复制一个给定偏移量和len的缓冲区,缓冲区不包含结束的空字符)

改为:

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] = '\0';  // don't forget to null-terminate

如果源是空的,那么你在string中有一个非空终止字符串

【讨论】:

  • 我将 string[str_len] = 0 更改为 string[str_len + 1] = 0 但这导致它打印出这个奇怪的符号
  • @Hedron: string[str_len] = 0; 是正确的,虽然我更喜欢string[str_len] = '\0';
  • 顺便说一句,您可以打印lexer-&gt;src[lexer-&gt;ptr - str_len] 以确保来源正常吗?
  • printf("%s\n", lexer-&gt;ptr - str_len); 引发访问冲突异常。但是我认为我正在取得进展,现在它正在打印具有正确长度的═══════;但是,显然不是正确的字符。很抱歉给我带来的麻烦,我是 C 的新手,我被 CPP 宠坏了。
  • 我的意思是:printf("%s\n", lexer-&gt;src[lexer-&gt;ptr - str_len]);。当然,否则它会崩溃:您正在将整数转换为字符串...顺便说一句,lexer-&gt;ptr 的类型是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2023-02-15
  • 1970-01-01
相关资源
最近更新 更多