请问一个求输入字符的种类、个数的有关问题
请教一个求输入字符的种类、个数的问题
代码如图:


例如输入 ****。
若没圈出的那两句输出为:

有有那两句则输出正确:

想问下:圈出的两句的意思是不是“若为空格则跳出”?
还有为什么这两句改变的这么多,怎么解释?
Ps: 用的是code::blocks
代码为:
#include <iostream>
using namespace std;
int main()
{
cout<<"string : "<<endl;
const int N=200;
char cha[N],letters[N];
int k,i,counts[N]={0};
cin.getline(cha,N,'\n');
for(i=0;i<=N;i++)
{
if (cha[i]=='\0')
break;
k=tolower(cha[i]);
counts[k]++;
}
for(k=0;k<=N;k++)
{
letters[k]=(char)(k);
if(counts[k]>0)
cout<<letters[k]<<": "<<counts[k]<<endl;
}
return 0;
}
多谢~
------解决方案--------------------
C数组以'\0'结尾,过了'\0'之后后面的就都是无效区域了。如果不加的话,for循环会一直运行201次,并统计那些不属于你输入内容的不可知随机数据。
------解决方案--------------------
楼上所言极是
所以通常定义字符数组的时候顺便初始化下,如:
还有一点:
------解决方案--------------------
C风格的字符串(字符数组)通常以一个空字符'\0'来作为结束标记,否则在循环处理字符数组时无法知道结束没有,所以分配字符串空间(通常是动态分配)时需要在计算的长度基础上+1来为结束符预留一个字节的空间。局部字符数组在定义后系统不会为其进行初始化,所以为了防止没有结束符,通常先进行初始化
如:char str[10] = {0}; // 每个字符的值都为0(结束符'\0'的ascii码值就是0);
或者memset(str ,0 ,10);
代码如图:
例如输入 ****。
若没圈出的那两句输出为:
有有那两句则输出正确:
想问下:圈出的两句的意思是不是“若为空格则跳出”?
还有为什么这两句改变的这么多,怎么解释?
Ps: 用的是code::blocks
代码为:
#include <iostream>
using namespace std;
int main()
{
cout<<"string : "<<endl;
const int N=200;
char cha[N],letters[N];
int k,i,counts[N]={0};
cin.getline(cha,N,'\n');
for(i=0;i<=N;i++)
{
if (cha[i]=='\0')
break;
k=tolower(cha[i]);
counts[k]++;
}
for(k=0;k<=N;k++)
{
letters[k]=(char)(k);
if(counts[k]>0)
cout<<letters[k]<<": "<<counts[k]<<endl;
}
return 0;
}
多谢~
------解决方案--------------------
C数组以'\0'结尾,过了'\0'之后后面的就都是无效区域了。如果不加的话,for循环会一直运行201次,并统计那些不属于你输入内容的不可知随机数据。
------解决方案--------------------
楼上所言极是
所以通常定义字符数组的时候顺便初始化下,如:
char cha[N] = {0}; // 或用之前memset[code=c]
还有一点:
const int N = 200;
for(k=0; k<=N; k++) // 这里好像不能等于N了,可能会有问题的
{
letters[k]=(char)(k);
if(counts[k]>0)
cout<<letters[k]<<": "<<counts[k]<<endl;
}
[code=c]
------解决方案--------------------
C风格的字符串(字符数组)通常以一个空字符'\0'来作为结束标记,否则在循环处理字符数组时无法知道结束没有,所以分配字符串空间(通常是动态分配)时需要在计算的长度基础上+1来为结束符预留一个字节的空间。局部字符数组在定义后系统不会为其进行初始化,所以为了防止没有结束符,通常先进行初始化
如:char str[10] = {0}; // 每个字符的值都为0(结束符'\0'的ascii码值就是0);
或者memset(str ,0 ,10);