#include<iostream>
using namespace std;
int main()
{
int sp=0,lett=0,oth=0;
int shu[10]={0};
char s[80]={0};
cout<<"輸入字串:"<<endl;
gets(s);
cout<<"輸出字串:"<<endl;
for(int i=0;i<80;i++)
cout<<s[i];
cout<<endl;
cout<<"統計結果為:"<<endl;
for(int j=0;j!='\n'&&j<80;j++)
{
if(s[j]==' ')
sp++;
else if(s[j]>='0'&&s[j]<='9')
shu[s[j]]++;
else if(s[j]>='a'&&s[j]<='z'||s[j]>='A'&&s[j]<='Z')
lett++;
else
oth++;
}
for(int k=0;k<10;k++)
cout<<k<<":"<<shu[k]<<",";
cout<<"\n空格:"<< sp<<",英文字符:"<< lett <<",其它字符:"<<oth<<endl;
return 0;
}
其他字符輸出總是不對,數字輸出例外,空格有時例外。
求大佬幫忙分析哪錯了
uj5u.com熱心網友回復:
修改如下,供參考:#include<iostream>
using namespace std;
int main()
{
int sp=0,lett=0,oth=0;
int shu[10]={0};
char s[128]={0};
cout<<"輸入字串:"<<endl;
gets(s);
cout<<"輸出字串:"<<endl;
for(int i=0;s[i]!='\0';i++)//for(int i=0;i<80;i++)
cout<<s[i];
cout<<endl;
cout<<"統計結果為:"<<endl;
for(int j=0;s[j]!='\0';j++)//for(int j=0;j!='\n'&&j<80;j++)
{
if(s[j]==' ')
sp++;
else if(s[j]>='0'&&s[j]<='9')
shu[s[j]-'0']++; //shu[s[j]]++;
else if((s[j]>='a'&&s[j]<='z')||(s[j]>='A'&&s[j]<='Z'))
lett++;
else
oth++;
}
for(int k=0;k<10;k++)
cout<<k<<":"<<shu[k]<<",";
cout<<"\n空格:"<< sp<<",英文字符:"<< lett <<",其它字符:"<<oth<<endl;
return 0;
}
uj5u.com熱心網友回復:
int shu[10]={0};
char s[80]={0};
肯定數字字符統計是有問題的
shu[s[j]]++;
改成
shu[s[j]-'0']++;
就可以了。
這樣其他的也應該對了。
因為原先的會造成越界訪問,讓其他的也亂掉。
uj5u.com熱心網友回復:
為啥會越界 shu[s[j]-'0']++中-'0'的意義是啥uj5u.com熱心網友回復:
shu[10]={0}定義了存放0-9數字的陣列,shu[10]下標也是0-9。 代碼里統計數字時 shu[s[j]]++,假設此時s[j]= '0',字符'0'的ASCII碼值是48,這句就是shu[48]++,下標就越界了,字符'0...' 和數字 0 ...在計算機里是不同的,所以要想得到正確的值就應這樣:shu[s[i]-‘0'],字符'1'的ASCII碼值為49,當s[i]='1'時,shu[s[j]-'0']=shu[49-48]=shu[1],以此類推。uj5u.com熱心網友回復:
懂了謝謝。。。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280003.html
標籤:C++ 語言
上一篇:求大佬救救我
下一篇:小組作業--討論區
