c++ isalpha函数的问题

程序打算返回字符串中字母可汉字的个数,用到了isalpha函数程序如下:#include<iostream>usingnamespacestd;intmain(){cha... 程序打算返回字符串中字母可汉字的个数,用到了isalpha函数
程序如下:
#include <iostream>
using namespace std;
int main()
{
char str[20]="I love 清华";
char* p=str;
int i=0;
float numcha=0;
int numlet=0;
while(p[i]!='\0')
{
if(p[i]<0)
numcha+=0.5;
if(isalpha( p[i]))
numlet+=1;

i++;
}
cout<<"汉字个数为:"<<numcha<<endl;
cout<<"字母个数为:"<<numlet<<endl;
return 0;
}

但是却发现结果显示是这样的,字母数量多了一个

假如我把字符串改为"清",那么依旧显示有一个字母。
然而华字不会产生这种情况,改变其他字发现“天”和“大”都有这种问题。我觉得是函数误认为汉字的unicode对应了字母的ASCII码。
但是分开输入“大”的unicode:B4F3时函数反应正确无误。
不知道哪里出现问题了,希望大家帮助解决这个问题~~
展开
 我来答
451006071
2012-07-19 · TA获得超过1332个赞
知道小有建树答主
回答量:368
采纳率:57%
帮助的人:330万
展开全部
你在判断的时候要注意,汉子内码占2个字节,并且高位字节的最高位是1,而我们的字母和数字只占一个字节且高位不可能是1,你要先判断是不是汉字,是汉字的话,那么后面那个字节不用管,因为1个汉字2字节,如果高位不是1则说明这个不是汉字而是字母
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
adoqq_bd
推荐于2016-05-25 · TA获得超过7050个赞
知道大有可为答主
回答量:1818
采纳率:63%
帮助的人:1622万
展开全部
//因为汉字的后半部分可能不小于0同时还可能满足if(isalpha( p[i])),就会混乱
把循环改成这样,numcha也不用float了

while(p[i]!='\0')
{
if(p[i]<0)
{ numcha++;i+=2;continue;}
if(isalpha( p[i]))
numlet+=1;
i++;
}
追问
但是汉字不是由A0+区码和A0+位码构成的吗?既然如此应该全部小于零啊
追答
哦,不是你这么说我还真没注意,我运行了下你的代码,debug模式报错(断言失败isalpha()参数小于0),忽略后结果没问题,releae模式也没问题,结果正确 vc2010
改成这样后就不报错了
if(p[i]<0)
numcha+=0.5;
else //小于0就不进行isalpha了
if(isalpha( p[i]))
numlet+=1;

是isalpha函数在参数小于0时不同的编译器会有不同的处理
你试试这个就明白了,小于0 时可能返回真哦:devc++就返回好多非0,vc2010全部返回0
for(int i=-128;i<0;i++)
cout<<isalpha(i)<<" ";

总之只要避免在p[i]小于0时作isalpha()判断就没问题了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kingkate2009
2012-07-19 · TA获得超过535个赞
知道小有建树答主
回答量:557
采纳率:50%
帮助的人:253万
展开全部
已改:
#include <iostream>
using namespace std;
int main()
{

char str[20]="I love 清大华";

char* p=str;

int i=0;

float numcha=0;

int numlet=0;

while(p[i]!='\0')

{

if(p[i]<0)

{
numcha+=0.5;
// i++;
}

else if(isalpha( p[i]))//这里应该为else if 因为如果前面的条件成立的话,后边的就不用判断了

{
numlet+=1;

}
i++;

}

cout<<"汉字个数为:"<<numcha<<endl;

cout<<"字母个数为:"<<numlet<<endl;

return 0;

}
希望对你有所帮助!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式