我试图将Lua(5.1.5)中的字符串转换为整数,并检查该数字是否为有效整数(0~99999).但是,我发现lua_tonumber()在处理大整数时与lua_tointeger()有不同的行为.
int main()
{
int in;
double db;
lua_State* Lua = luaL_newstate();
luaL_openlibs(Lua);
lua_pushstring(Lua, "213232127162767162736718238168263816873");
db = lua_tonumber(Lua, -1);
in = lua_tointeger(Lua, -1);
printf("DOUBLE:%f\n", db); // DOUBLE:213232127162767176000119210017101447168.000000
printf("INT:%d\n", in); // INT:0
};
Run Code Online (Sandbox Code Playgroud)
如果我使用lua_tointeger(),它将返回0并将通过我的检查.
我检查了两个API描述,但我仍然不知道为什么他们有不同的行为.这些行为是否与机器无关?使用lua_tonumber()更好的方法吗?
我可以使用以下代码检查结果吗?(跨平台)
if (!lua_isnumber(Lua, -1)) { //error }
result = lua_tonumber(Lua, -1);
if (result < 0 || result > 99999) { // error2 }
// pass
Run Code Online (Sandbox Code Playgroud) 我想将日期为2013年1月31日的日期转换为年中的日期(本例中为31日).此日期来自用户输入,因此我还需要检查它是否是有效日期.我知道我可以自己计算一年中的一天,如下所示:
int get_yday(int mon, int day, int year)
{
int yday=0;
mon--;
switch (mon){
case 12:
yday+=31;
case 11:
yday+=30;
....
case 2:
if (is_leap_year(year)) yday+=29;
else yday+=28;
.....
Run Code Online (Sandbox Code Playgroud)
但是,这意味着我需要自己检查用户输入
switch(month){
case 1:
if (day > 31 || day < 0) {...}
case 2:
if (...check leap year and day ...) {...}
Run Code Online (Sandbox Code Playgroud)
C中是否有内置的API可以轻松获取日期?
我有一个解决方案,但我想知道是否有更好的解决方案:
1. creating a tm struct of 01/31/2013 00:00:00
2. get timestamp by mktime()
3. convert timestamp to struct tm by localtime()
4. get tm_yday from tm …Run Code Online (Sandbox Code Playgroud)