校验字符串是否为数字,并且范围满足的问题

pengxn 2010-10-14 10:38:35

配置了一个字符串,校验是否是阿拉伯数字,使用isxdigit逐个判断就可以了

现在遇到一个问题
比如需要确认字符串应该是int 或者long long型的时候,如何判断配置的值已经超过范围了

比如
‘3333333333’,这个已经超过int的上限了
...全文
221 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2010-10-14
  • 打赏
  • 举报
回复
判断
int i;
__int64 i64;
long long ll;
int r;
r=sscanf(s,"%d",&i);
r=sscanf(s,"%lld",&ll);//这行不一定对
r=sscanf(s,"%i64d",&i64);
的返回值r是否为1
gules 2010-10-14
  • 打赏
  • 举报
回复
可以使用istringstream,读取后即可转换为相应的数值类型,再判断。
AlanBruce 2010-10-14
  • 打赏
  • 举报
回复
kankan...

kankan,,
pengxn 2010-10-14
  • 打赏
  • 举报
回复
可以atoi 一下,然后再sprintf以后,比较新旧字符串是否一样
Defonds 2010-10-14
  • 打赏
  • 举报
回复
直接用 long long 型。
ayw215 2010-10-14
  • 打赏
  • 举报
回复
atoi,然后查看返回值判断是否成功
pengxn 2010-10-14
  • 打赏
  • 举报
回复
希望同步考虑负数的情况,谢谢
selooloo 2010-10-14
  • 打赏
  • 举报
回复
只判断十进制整数的情况
#include <stdio.h>
#include <string.h>

int isint(char* s)
{
char *intmax="2147483647",*intmin="-2147483648";
if(*s=='-')
{
if(strlen(s)<strlen(intmin))
return 1;
if(strlen(s)>strlen(intmin))
return 0;
else if(strcmp(s,intmin)>0)
return 0;
else
return 1;
}
else
{
if(strlen(s)<strlen(intmax))
return 1;
if(strlen(s)>strlen(intmax))
return 0;
else if(strcmp(s,intmax)>0)
return 0;
else
return 1;
}
}

int main(void)
{
char *s[10]={"99","0","2147483647","-2147483648","-99999","3333333333","2053333333","13333333333","-3333333333","-933333333"};
int i;

for(i=0;i!=10;++i)
if(isint(s[i]))
printf("%s is integer\n",s[i]);
else
printf("%s is not intger\n",s[i]);

getchar();
return 0;
}
redleaves 2010-10-14
  • 打赏
  • 举报
回复
随手写了一个,只能处理10进制数
#include <iostream>
template < typename _TType >
bool is_valid_number( const char *sz ) {
_TType num = 0;
int pos = 0;
while( sz && sz[pos] ) {
switch( sz[pos] ) {
case '+':
if ( pos > 0 ) {
return false;
}
break;
case '-':
if ( pos > 0 ) {
return false;
}
++pos;
if ( !(sz[pos] >= '0' && sz[pos] <= '9') ) {
return false;
}
num = -(signed char)(sz[pos] - '0');
break;
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
{
_TType old_num = num;
signed char val = (signed char)(sz[pos] - '0');
if ( num >= 0 ) {
num = num * 10 + val;
} else {
num = num * 10 - val;
}
if ( num/10 != old_num ) {
return false;
}
}
break;
default:
return false;
}
++pos;
}
return true;
}

int main() {
const char * nums[] = {
"0",
"-1",
"32768",
"32767",
"-32768",
"-32769",
"2000000000",
"-2000000000",
"-4000000000",
"4000000000",
};

for ( size_t idx = 0; idx<sizeof(nums)/sizeof(nums[0]); ++idx ) {
std::cout << nums[idx] << (is_valid_number<short>(nums[idx])?" is a valid short integer":" not a valid short integer") << std::endl;
std::cout << nums[idx] << (is_valid_number<long>(nums[idx])?" is a valid long integer":" not a valid long integer") << std::endl;
std::cout << nums[idx] << (is_valid_number<long long>(nums[idx])?" is a valid long long integer":" not a valid long long integer") << std::endl;
}

return 0;
}
zmshy2128 2010-10-14
  • 打赏
  • 举报
回复
四种方法:
1、sscanf

int num;
sscanf(str, "%d", &num);

2、sscanf_s
和sscanf功能一致,但是增加了说明 str 长度的参数,可防止内存越界错误
3、使用istringstream

int num;
istringstream stream(str);
stream>>num;

4、使用boost::lexical_cast
int num = boost::lexical_cast<int>(str);


推荐第四种方法,永远不要使用第一种方法。
harderman 2010-10-14
  • 打赏
  • 举报
回复
学习.
mymtom 2010-10-14
  • 打赏
  • 举报
回复
考虑用strtol

#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

int isInteger(const char *s)
{
long val;
char *ptr;

errno = 0;
ptr = 0;
val = strtol(s, &ptr, 10);
if (errno || (ptr && *ptr) || val < (long)INT_MIN || val > INT_MAX)
return 0;

return 1;
}

int main(void)
{
const char *s;
s = "xxxxxxx1234"; printf("%s %d\n", s, isInteger(s));
s = "xxxxxxxxxxx"; printf("%s %d\n", s, isInteger(s));
s = "1234xxxxxxx"; printf("%s %d\n", s, isInteger(s));
s = "1234xxx1234"; printf("%s %d\n", s, isInteger(s));
s = "+3333333333"; printf("%s %d\n", s, isInteger(s));
s = "+1234567890"; printf("%s %d\n", s, isInteger(s));
s = "+2147483647"; printf("%s %d\n", s, isInteger(s));
s = "+2147483648"; printf("%s %d\n", s, isInteger(s));
s = "-2147483648"; printf("%s %d\n", s, isInteger(s));
s = "-2147483649"; printf("%s %d\n", s, isInteger(s));

return 0;
}
/* 输出:
xxxxxxx1234 0
xxxxxxxxxxx 0
1234xxxxxxx 0
1234xxx1234 0
+3333333333 0
+1234567890 1
+2147483647 1
+2147483648 0
-2147483648 1
-2147483649 0
*/

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧