首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >斯特伦不算新台词吗?

斯特伦不算新台词吗?
EN

Stack Overflow用户
提问于 2015-08-30 23:12:21
回答 1查看 4.9K关注 0票数 1

我将lua嵌入到我的项目中,并遇到了strlen和lua解释的奇怪行为(对我来说)。我试图用luaL_loadbuffer加载一个包含lua代码的字符串,它始终在lua代码的最后一行中抛出"unexpected symbol“错误,除非整个块都写在一行中。例如:

代码语言:javascript
复制
  function start()
      print("start")
  end

总是导致错误:第3行中的意外符号,但是

代码语言:javascript
复制
function start() print("start") end

装载成功。

我发现用luaL_loadstring加载相同的块不会产生任何错误,并且看到它使用strlen来确定指定字符串的长度(我使用了std::string::size),而且使用strlen向luaL_loadbuffer提供字符串的长度也会导致成功的加载。

现在的问题是: strlen和std::string::size之间的区别可能是什么,而我最惊讶的是,strlen没有计算新行('\n')。这就是:

代码语言:javascript
复制
 const char* str  = "this is a string\nthis is a newline";
  std::string str2(str);
  str2.size(); // gives 34
  strlen(str); // gives 33

大小与strlen返回的值之间的差异始终是新行字符的数目。

我的问题是:

  1. 斯特伦真的不算新行还是我漏掉了什么?
  2. 换行符如何在内部影响lua代码的解释?

我正在使用vs 2015和lua 5.3.0

编辑:

我的第一个示例并不准确,也没有对我产生详细的影响,但是我能够从原始代码中重新创建这个问题:

代码语言:javascript
复制
std::fstream _Stream("test.lua", std::ios::ate | std::ios::in);
    std::string _Source;
    if(_Stream.is_open()) {
        _Source.resize(_Stream.tellg());
        _Stream.seekg(0, std::ios::beg);
        _Stream.read(&_Source[0], _Source.size());
        _Stream.close();
    }

    std::cout << "std::string::size() = " << _Source.size() << std::endl;
    std::cout << "strlen() = " << strlen(_Source.c_str()) << std::endl;

test.lua的含量为"function start()\n\tprint("start")\nend\n\nstart()"

不同之处是换行符的数目:

http://i.stack.imgur.com/y0QOW.png

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-31 10:02:31

窗口的行尾(CR+LF)是两个字符,使得文件大小大于字符串中的字符数,因此resize操作使用的是文件大小,而不是以空结尾的字符串的长度。strlen报告以空结尾的字符串的长度,并将\n计数为单个字符。您可以通过调整字符串的大小使其与C字符串的长度相匹配,然后进行匹配:

代码语言:javascript
复制
_Source.resize(strlen(_Source.c_str()) + 1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32302059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档