How to check conversion from C++ string to unsigned int

南笙酒味 提交于 2019-12-24 01:54:45

问题


I need to:

1) Find what is the maximum unsigned int value on my current system. I didn't find it on limits.h. Is it safe to write unsigned int maxUnsInt = 0 - 1;? I also tried unsigned int maxUnsInt = MAX_INT * 2 + 1 that returns the correct value but the compiler shows a warning about int overflow operation.

2) Once found, check if a C++ string (that I know it is composed only by digits) exceeded the maximum unsigned int value on my system.

My final objective is to convert the string to a unsigned int using atoi if and only if it is a valid unsigned int. I would prefer to use only the standard library.


回答1:


There should be a #define UINT_MAX in <limits.h>; I'd be very surprised if there wasn't. Otherwise, it's guaranteed that:

unsigned int u = -1;

will result in the maximum value. In C++, you can also use std::numeric_limits<unsigned int>::max(), but until C++11, that wasn't an integral constant expression (which may or may not be a problem).

unsigned int u = 2 * MAX_INT + 1;

is not guaranteed to be anything (on at least one system, MAX_INT == UMAX_INT).

With regards to checking a string, the simplest solution would be to use strtoul, then verify errno and the return value:

bool
isLegalUInt( std::string const& input )
{
    char const* end;
    errno = 0;
    unsigned long v = strtoul( input.c_str(), &end, 10 );
    return errno == 0 && *end == '\0' && end != input.c_str() && v <= UINT_MAX;
}

If you're using C++11, you could also use std::stoul, which throws an std::out_of_range exception in case of overflow.




回答2:


numeric_limits has limits for various numeric types:

unsigned int maxUnsInt = std::numeric_limits<unsigned int>::max();

stringstream can read a string into any type that supports operator>> and tell you whether it failed:

std::stringstream ss("1234567890123456789012345678901234567890");

unsigned int value;
ss >> value;

bool successful = !ss.fail();



回答3:


According to this you do not need to calculate it, just use appropriate constant, which it this case should be UINT_MAX.

Few notes.

This seems more of a c way in contrast to c++ but since you say you want to use atol I stick with it. c++ would be using numeric_limits as Joachim suggested. However the c++ standard also defines the c-like macros/definitions, so it should be safe to use.

Also if you want it to be c++-way, it would probably be preferred to use stringstream (which is a part of standard c++ library) for conversion.

Lastly I deliberately don't post explicit code solution, 'cause it looks like homework, and you should be good to go from here now.



来源:https://stackoverflow.com/questions/14893264/how-to-check-conversion-from-c-string-to-unsigned-int

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!