如何在C++中将字符串转换为无符号长
How to convert string to unsigned long in C++?
我需要编程方面的帮助。程序必须接受一个字符串,该字符串最终将变为无符号长字符串。但问题是,必须有一个错误捕获器,当您输入十六进制和符号(如a!!!!!!
)的组合时,会产生错误,并且无符号长变量必须能够接受和存储大于4294967295
的输入,即FFFFFFFF
。我试过这个代码段:
char buffer[256];
unsigned long holder;
fgets(buffer,256,stdin);
holder = strtoul (buffer,NULL,16);
我的问题是,当我输入FFFFFFFFF
(9F)而不是FFFFFFFF
(8F)时,持有者仍然会接受4294967295
,即使它比。另一件事是,当我将十六进制和像a!!!!!
这样的符号组合在一起时,fgets
仍然考虑十六进制A。
你能告诉我怎么做吗?如果你知道除此代码之外的任何其他想法,请告诉我。谢谢
因此,如果您查看strtoul
的此文档,您将在Return Value
部分下看到:
如果转换后的值超出相应返回类型的范围,则发生范围错误,并返回ULONG_MAX或ULONG_MAX。
因此,对于超出范围的检查,您需要类似的代码:
if ( ( holder == ULONG_MAX || holder == ULLONG_MAX ) && errno == ERANGE)
对于a!!!!
案例,回顾同一文档,您将看到:
函数将str_end指向的指针设置为指向经过最后一个解释字符的字符。如果str_end为NULL,则会忽略它。
您当前正在传递NULL
,但如果您传递了一个参数:
char *p;
holder = strtoul (buffer,&p,16);
现在可以检查*p
是否是NULL终止符,如果是,则处理所有字符,否则您就知道有问题。
您还可以选择使用stoul
,如果无法执行转换,则抛出以下异常std::invalid_argument
;如果转换后的值超出结果类型的范围,则抛出std::out_of_range
。
例如,您可以执行以下操作:
std::string str1(n) ;
size_t pos ;
try
{
holder = std::stoul( str1, &pos, 16 ) ;
}
catch( std::invalid_argument e )
{
std::cout << "Invalid argument" << std::endl ;
}
catch ( std::out_of_range e )
{
std::cout << "Out of range" << std::endl ;
}
pos
将是处理的最后一个字符的索引,在您的情况下,如果pos != str1.length()
,则它无法处理整个字符串,并且您有问题。
如果您使用的是;旧的C风格字符串";,那么您可以添加额外的检查以查看";所有字符都被取";通过将CCD_ 19传递到CCD_。
换句话说:
char *end_ptr = NULL;
....
errno = 0;
holder = strtoul(buffer, &end_ptr, 16);
end_ptr
将指向经过所接受输入的字符1;a&";,它将指向一个"!"。
if (end_ptr != ' ') // Should point at "end of string marker".
{
... do something to indicate error.
}
要检测溢出,您必须依靠errno
:
if (errno != 0)
{
... deal with errors here .
}
显然,你可以做到:
if (errno != 0 || *end_ptr != ' ')
{
.... deal with errors.
}
使用C++std:stoul()
函数会引发异常,因此C++风格的解决方案类似于:
try
{
holder = std::stoul(buffer);
}
catch(...)
{
... deal with error ...
}
正如其他海报所说,如果你有stoul
,请使用它。
如果你不这样做,你可能可以做一些类似的事情:
std::istringstream strm( buffer );
unsigned long holder = 1;
strm >> std::hex >> holder;
if( strm.fail() )
// out-of-range
if( ! strm.eof() )
// didn't read all available characters - catches "A!!!"
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 将浮点数转换为无符号字符数组并打印出来
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 将无符号转换为复杂<int>原因符号转换警告
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 将字符串转换为无符号字符数组/字节数组
- 转换“;无符号字符*”;至“;char*”;(和字符串)