我将lua嵌入到我的项目中,并遇到了strlen和lua解释的奇怪行为(对我来说)。我试图用luaL_loadbuffer加载一个包含lua代码的字符串,它始终在lua代码的最后一行中抛出"unexpected symbol“错误,除非整个块都写在一行中。例如:
function start()
print("start")
end总是导致错误:第3行中的意外符号,但是
function start() print("start") end装载成功。
我发现用luaL_loadstring加载相同的块不会产生任何错误,并且看到它使用strlen来确定指定字符串的长度(我使用了std::string::size),而且使用strlen向luaL_loadbuffer提供字符串的长度也会导致成功的加载。
现在的问题是: strlen和std::string::size之间的区别可能是什么,而我最惊讶的是,strlen没有计算新行('\n')。这就是:
const char* str = "this is a string\nthis is a newline";
std::string str2(str);
str2.size(); // gives 34
strlen(str); // gives 33大小与strlen返回的值之间的差异始终是新行字符的数目。
我的问题是:
我正在使用vs 2015和lua 5.3.0
编辑:
我的第一个示例并不准确,也没有对我产生详细的影响,但是我能够从原始代码中重新创建这个问题:
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
发布于 2015-08-31 10:02:31
窗口的行尾(CR+LF)是两个字符,使得文件大小大于字符串中的字符数,因此resize操作使用的是文件大小,而不是以空结尾的字符串的长度。strlen报告以空结尾的字符串的长度,并将\n计数为单个字符。您可以通过调整字符串的大小使其与C字符串的长度相匹配,然后进行匹配:
_Source.resize(strlen(_Source.c_str()) + 1);https://stackoverflow.com/questions/32302059
复制相似问题