c语言 get找不到标识符,c - 错误C3861:'strtoll':找不到标识符 - SO中文参考 - www.soinside.com...

由于你的return_val是unsigned int,你可能应该使用自C89以来一直是标准的strtoul(),因此得到MSVC的支持(而strtoll()只是自C99以来的标准并且不受MSVC支持)。

您对错误条件的测试是不够的。在调用转换函数之前,需要将errno设置为零;您还需要检测是否报告了错误,这比看起来更棘手。

第§7.20.1.4节'C99标准的strtol,strtoll,strtoul和strtoull函数'表示:

返回

strtol,strtoll,strtoul和strtoull函数返回转换后的值(如果有的话)。如果无法执行转换,则返回零。如果正确的值超出可表示值的范围,则返回LONG_MIN,LONG_MAX,LLONG_MIN,LLONG_MAX,ULONG_MAX或ULLONG_MAX(根据值的返回类型和符号,如果有),并且宏ERANGE的值为存储在errno。

您还必须查看存储在endptr参数中的值到转换函数,以告知没有执行转换(与转换的有效零相反)。

如果主题序列为空或者没有预期的形式,则不进行转换; nptr的值存储在endptr指向的对象中,前提是endptr不是空指针。

所以,你必须编写更像这样的代码(省略对EINVAL的测试,因为标准没有提到将errno设置为EINVAL的这些函数):

unsigned int return_val=0;

if (index + 1 <= argc - 1)

{

char *end;

unsigned long ul;

errno = 0;

ul = strtoul(argv[index+1], &end, 10);

if ((ul == 0 && end == argv[index+1]) ||

(ul == ULONG_MAX && errno == ERANGE) ||

(ul > UINT_MAX))

{

fprintf(stderr, "Could not parse argument %s for switch %s!\n",

argv[index], argv[index+1]);

return 0;

}

retval = (unsigned int)ul;

}

请注意,这比有符号整数转换的测试更简单,必须考虑负_MIN限制以及_MAX限制。

另请注意,您确实应该将结果记录在unsigned long中,然后检查它是否适合您指定的范围,这可能仅限于UINT_MAX(在类似Unix的64位环境中可能小于ULONG_MAX)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值