C++ cctype头文件里面的isdigit()函数

chaochao1167 2017-04-21 12:30:55
在看C++Primer这本书得的时候,想着用VS测试下,然后定义了下面是代码
	
string testString = "abcdefg12345测试字符串";
int count = 0;
for (const auto &c : testString)
{
if (isdigit(c))
{
++count;
}
}



这段代码在Release模式下运行是没有问题的。但是在Debug运行会弹出有一个asserts。如下图


大概得意思是只能传ascii码0~255之间的char,isdigit作为库函数,连这点判断都没有么。还是因为其他什么问题
望解答,谢谢
...全文
975 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujinqiang 2017-04-28
  • 打赏
  • 举报
回复
c++ 这种效率优先的语言,一般都默认调用者已经是大神级别。
赵4老师 2017-04-24
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
xskxzr 2017-04-21
  • 打赏
  • 举报
回复
引用 3 楼 chaochao1167 的回复:
[quote=引用 楼主 chaochao1167 的回复:] 在看C++Primer这本书得的时候,想着用VS测试下,然后定义了下面是代码
	
        string testString = "abcdefg12345测试字符串";
	int count = 0;
	for (const auto &c : testString)
	{
		if (isdigit(c))
		{
			++count;
		}
	}
这段代码在Release模式下运行是没有问题的。但是在Debug运行会弹出有一个asserts。如下图 大概得意思是只能传ascii码0~255之间的char,isdigit作为库函数,连这点判断都没有么。还是因为其他什么问题 望解答,谢谢
这不是数据完整性的问题,要是在调用这个函数之前需要检测一次参数是否是中文或则其他“无效”符号,那还要需要用这个函数干嘛。。。中文也应该返回一个0不就行了[/quote] C++就是这样啊,为了效率不择手段
chaochao1167 2017-04-21
  • 打赏
  • 举报
回复
引用 楼主 chaochao1167 的回复:
在看C++Primer这本书得的时候,想着用VS测试下,然后定义了下面是代码
	
        string testString = "abcdefg12345测试字符串";
	int count = 0;
	for (const auto &c : testString)
	{
		if (isdigit(c))
		{
			++count;
		}
	}
这段代码在Release模式下运行是没有问题的。但是在Debug运行会弹出有一个asserts。如下图 大概得意思是只能传ascii码0~255之间的char,isdigit作为库函数,连这点判断都没有么。还是因为其他什么问题 望解答,谢谢
这不是数据完整性的问题,要是在调用这个函数之前需要检测一次参数是否是中文或则其他“无效”符号,那还要需要用这个函数干嘛。。。中文也应该返回一个0不就行了
vnvlyp 2017-04-21
  • 打赏
  • 举报
回复
isdigit(c & 0xFF)
isdigit的参数是int类型的。。如果你的char是有符号的,那么很有可能转换成int的时候进行符号扩展 那么中文字符的像0xA0这种会被扩展成0xFFFFFFA0的。。
ri_aje 2017-04-21
  • 打赏
  • 举报
回复
说了不管:The behavior is undefined if the value of ch is not representable as unsigned char and is not equal to EOF c++ 这种效率优先的语言,一般都不管各种数据完整性检测的破事儿,这默认都是调用者的责任。

33,322

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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